检查 JSON 是对象还是数组

Go 中是否有一种简单的方法来检查给定的 JSON 是对象{}还是数组[]

首先想到的是json.Unmarshal()进入一个界面,然后看它是不是变成了一张地图,或者是一片地图。但这似乎效率很低。

我可以只检查第一个字节是 a{还是 a 吗[?或者是否有更好的方法已经存在。


莫回无
浏览 161回答 3
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

ibeautiful

使用类型开关来确定类型。这类似于 Xay 的回答,但更简单:var v interface{}if err := json.Unmarshal(data, &v); err != nil {    // handle error}switch v := v.(type) {case []interface{}:    // it's an arraycase map[string]interface{}:    // it's an objectdefault:    // it's something else}

大话西游666

使用json.Decoder. 这比其他答案有优势:比解码整个值更有效使用官方的 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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go