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