rob*_*y22 4 json go unmarshalling
Go中是否有一种简单的方法来检查给定的JSON是对象{}还是数组[]?
首先想到的是json.Unmarshal()进入接口,然后查看它是否成为地图或地图切片。但这似乎效率很低。
我可以检查一下第一个字节是a {还是a [吗?还是有一个更好的方法来做到这一点已经存在。
使用以下内容检测[]byte值data中的JSON文本是数组还是对象:
// Get slice of data with optional leading whitespace removed.
// See RFC 7159, Section 2 for the definition of JSON whitespace.
x := bytes.TrimLeft(data, " \t\r\n")
isArray := len(x) > 0 && x[0] == '['
isObject := len(x) > 0 && x[0] == '{'
Run Code Online (Sandbox Code Playgroud)
此代码段处理可选的前导空白,并且比解组整个值更有效。
由于JSON顶层值也可以是数字,字符串,布尔或零,它可能是isArray与isObject这两个计算结果为假。当JSON无效时,值isArray和isObject也可以评估为false。
小智 5
使用类型开关来确定类型。这与 Xay 的答案类似,但更简单:
var v interface{}
if err := json.Unmarshal(data, &v); err != nil {
// handle error
}
switch v := v.(type) {
case []interface{}:
// it's an array
case map[string]interface{}:
// it's an object
default:
// it's something else
}
Run Code Online (Sandbox Code Playgroud)
使用 .json 逐步解析 JSON json.Decoder。这比其他答案有优势:
请注意,此代码未经测试,但应该足以让您了解。如果需要,它还可以轻松扩展以检查数字、布尔值或字符串。
func jsonType(in io.Reader) (string, error) {
dec := json.NewDecoder(in)
// Get just the first valid JSON token from input
t, err := dec.Token()
if err != nil {
return "", err
}
if d, ok := t.(json.Delim); ok {
// The first token is a delimiter, so this is an array or an object
switch (d) {
case '[':
return "array", nil
case '{':
return "object", nil
default: // ] or }, shouldn't be possible
return "", errors.New("Unexpected delimiter")
}
}
return "", errors.New("Input does not represent a JSON object or array")
}
Run Code Online (Sandbox Code Playgroud)
请注意,这消耗了的前几个字节in。如有必要,读者可以复印一份作为练习。如果您尝试从字节片 ( []byte) 读取数据,请首先将其转换为读取器:
t, err := jsonType(bytes.NewReader(myValue))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
555 次 |
| 最近记录: |