185 lines
3.8 KiB
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
|
|
} |