为了账号安全,请及时绑定邮箱和手机立即绑定

检查 JSON 是对象还是数组

检查 JSON 是对象还是数组

Go
莫回无 2023-06-12 16:20:57
Go 中是否有一种简单的方法来检查给定的 JSON 是对象{}还是数组[]?首先想到的是json.Unmarshal()进入一个界面,然后看它是不是变成了一张地图,或者是一片地图。但这似乎效率很低。我可以只检查第一个字节是 a{还是 a 吗[?或者是否有更好的方法已经存在。
查看完整描述

3 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

使用以下代码检测值中的 JSON 文本[]byte是data数组还是对象:


 // 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] == '{'

这段代码处理可选的前导空格,比解组整个值更有效。


因为 JSON 中的顶级值也可以是数字、字符串、布尔值或 nil,所以isArray和isObject都可能计算为 false。当 JSON 无效时,值isArray和也可以评估为 false。isObject


查看完整回答
反对 回复 2023-06-12
?
ibeautiful

TA贡献1993条经验 获得超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

}


查看完整回答
反对 回复 2023-06-12
?
大话西游666

TA贡献1817条经验 获得超14个赞

使用json.Decoder. 这比其他答案有优势:

  1. 比解码整个值更有效

  2. 使用官方的 JSON 解析规则,如果输入无效则生成标准错误。

请注意,此代码未经测试,但应该足以让您了解。如果需要,它还可以轻松扩展以检查数字、布尔值或字符串。

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")

}

请注意,这消耗了in. 如有必要,读者可以复印一份。如果您尝试从字节切片 ( ) 中读取[]byte,请先将其转换为读取器:


t, err := jsonType(bytes.NewReader(myValue))


查看完整回答
反对 回复 2023-06-12
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信