gjson/parse.go

81 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}
}