81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package gjson
|
||
|
||
import (
|
||
"encoding/json"
|
||
"strings"
|
||
)
|
||
|
||
// Parse 解析JSON字符串并返回对应的JSONBaseObject
|
||
func Parse(jsonStr string) (JSONBaseObject, error) {
|
||
// 去除首尾空白字符
|
||
trimmed := strings.TrimSpace(jsonStr)
|
||
|
||
if len(trimmed) == 0 {
|
||
return nil, &ParseError{"empty JSON string"}
|
||
}
|
||
|
||
// 根据第一个非空字符判断是对象还是数组
|
||
switch trimmed[0] {
|
||
case '{':
|
||
// 解析为JSONObject
|
||
obj := NewJSONObject()
|
||
err := obj.FromJSON(jsonStr)
|
||
return obj, err
|
||
case '[':
|
||
// 解析为JSONArray
|
||
arr := NewJSONArray()
|
||
err := arr.FromJSON(jsonStr)
|
||
return arr, err
|
||
default:
|
||
// 尝试解析为基础类型
|
||
return parsePrimitiveValue(jsonStr)
|
||
}
|
||
}
|
||
|
||
// ParseError 解析错误
|
||
type ParseError struct {
|
||
Message string
|
||
}
|
||
|
||
func (e *ParseError) Error() string {
|
||
return "parse error: " + e.Message
|
||
}
|
||
|
||
// parsePrimitiveValue 解析基础值类型
|
||
func parsePrimitiveValue(jsonStr string) (JSONBaseObject, error) {
|
||
trimmed := strings.TrimSpace(jsonStr)
|
||
|
||
// 检查是否为字符串
|
||
if len(trimmed) >= 2 && trimmed[0] == '"' && trimmed[len(trimmed)-1] == '"' {
|
||
// 解析字符串,去除首尾引号
|
||
var str string
|
||
err := json.Unmarshal([]byte(jsonStr), &str)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return NewJSONString(str), nil
|
||
}
|
||
|
||
// 检查是否为布尔值
|
||
if trimmed == "true" {
|
||
return NewJSONBool(true), nil
|
||
}
|
||
if trimmed == "false" {
|
||
return NewJSONBool(false), nil
|
||
}
|
||
|
||
// 检查是否为null
|
||
if trimmed == "null" {
|
||
return NewJSONNull(), nil
|
||
}
|
||
|
||
// 尝试解析为数字
|
||
var num float64
|
||
err := json.Unmarshal([]byte(jsonStr), &num)
|
||
if err == nil {
|
||
return NewJSONNumber(num), nil
|
||
}
|
||
|
||
// 如果都不是,则可能是无效的JSON
|
||
return nil, &ParseError{"unrecognized JSON value: " + jsonStr}
|
||
} |