gjson/values.go

185 lines
3.8 KiB
Go

package gjson
import (
"encoding/json"
"fmt"
"strconv"
)
// JSONString 字符串值类型
type JSONString struct {
value string
}
// NewJSONString 创建新的JSONString实例
func NewJSONString(value string) *JSONString {
return &JSONString{value: value}
}
// Value 返回实际的字符串值
func (js *JSONString) Value() interface{} {
return js.value
}
// ToJSON 返回JSON格式的字符串表示
func (js *JSONString) ToJSON() (string, error) {
bytes, err := json.Marshal(js.value)
if err != nil {
return "", err
}
return string(bytes), nil
}
// FromJSON 从JSON字符串初始化
func (js *JSONString) FromJSON(jsonStr string) error {
var str string
if err := json.Unmarshal([]byte(jsonStr), &str); err != nil {
return err
}
js.value = str
return nil
}
// ToString 返回字符串表示
func (js *JSONString) ToString() (string, error) {
return js.value, nil
}
// FromString 从字符串初始化
func (js *JSONString) FromString(str string) error {
js.value = str
return nil
}
// JSONNumber 数字值类型
type JSONNumber struct {
value float64
}
// NewJSONNumber 创建新的JSONNumber实例
func NewJSONNumber(value float64) *JSONNumber {
return &JSONNumber{value: value}
}
// Value 返回实际的数字值
func (jn *JSONNumber) Value() interface{} {
return jn.value
}
// ToJSON 返回JSON格式的数字表示
func (jn *JSONNumber) ToJSON() (string, error) {
return strconv.FormatFloat(jn.value, 'f', -1, 64), nil
}
// FromJSON 从JSON字符串初始化
func (jn *JSONNumber) FromJSON(jsonStr string) error {
var num float64
if err := json.Unmarshal([]byte(jsonStr), &num); err != nil {
return err
}
jn.value = num
return nil
}
// ToString 返回字符串表示
func (jn *JSONNumber) ToString() (string, error) {
return strconv.FormatFloat(jn.value, 'f', -1, 64), nil
}
// FromString 从字符串初始化
func (jn *JSONNumber) FromString(str string) error {
num, err := strconv.ParseFloat(str, 64)
if err != nil {
return err
}
jn.value = num
return nil
}
// JSONBool 布尔值类型
type JSONBool struct {
value bool
}
// NewJSONBool 创建新的JSONBool实例
func NewJSONBool(value bool) *JSONBool {
return &JSONBool{value: value}
}
// Value 返回实际的布尔值
func (jb *JSONBool) Value() interface{} {
return jb.value
}
// ToJSON 返回JSON格式的布尔值表示
func (jb *JSONBool) ToJSON() (string, error) {
return strconv.FormatBool(jb.value), nil
}
// FromJSON 从JSON字符串初始化
func (jb *JSONBool) FromJSON(jsonStr string) error {
var b bool
if err := json.Unmarshal([]byte(jsonStr), &b); err != nil {
return err
}
jb.value = b
return nil
}
// ToString 返回字符串表示
func (jb *JSONBool) ToString() (string, error) {
return strconv.FormatBool(jb.value), nil
}
// FromString 从字符串初始化
func (jb *JSONBool) FromString(str string) error {
b, err := strconv.ParseBool(str)
if err != nil {
return err
}
jb.value = b
return nil
}
// JSONNull 空值类型
type JSONNull struct{}
// NewJSONNull 创建新的JSONNull实例
func NewJSONNull() *JSONNull {
return &JSONNull{}
}
// Value 返回null值
func (jn *JSONNull) Value() interface{} {
return nil
}
// ToJSON 返回JSON格式的null表示
func (jn *JSONNull) ToJSON() (string, error) {
return "null", nil
}
// FromJSON 从JSON字符串初始化
func (jn *JSONNull) FromJSON(jsonStr string) error {
var val interface{}
if err := json.Unmarshal([]byte(jsonStr), &val); err != nil {
return err
}
if val != nil {
return fmt.Errorf("expected null, got %v", val)
}
return nil
}
// ToString 返回字符串表示
func (jn *JSONNull) ToString() (string, error) {
return "null", nil
}
// FromString 从字符串初始化
func (jn *JSONNull) FromString(str string) error {
if str != "null" {
return fmt.Errorf("expected 'null', got '%s'", str)
}
return nil
}