检测JSON字符串Golang中的重复项

检测JSON字符串Golang中的重复项,json,go,Json,Go,我有类似JSON的字符串 "{\"a\": \"b\", \"a\":true,\"c\":[\"field_3 string 1\",\"field3 string2\"]}" 如何使用Golang检测此json字符串中的重复属性可能工作得很好的方法是简单地解码、重新编码,然后对照旧json检查新json的长度: 正确的方法是重新实现json.Decode函数,并存储找到的键的映射,但上述方法应该可以工作(特别是如果您首先使用jsn=bytes.Replace(jsn,[]byte(“”,

我有类似JSON的字符串

"{\"a\": \"b\", \"a\":true,\"c\":[\"field_3 string 1\",\"field3 string2\"]}"

如何使用Golang检测此json字符串中的重复属性可能工作得很好的方法是简单地解码、重新编码,然后对照旧json检查新json的长度:

正确的方法是重新实现
json.Decode
函数,并存储找到的键的映射,但上述方法应该可以工作(特别是如果您首先使用
jsn=bytes.Replace(jsn,[]byte(“”,[]byte(“”,[]byte(“”,-1)从json中删除任何空格)
防止误报。

使用遍历JSON。找到对象后,遍历键和值以检查重复键

func check(d *json.Decoder, path []string) error {
    // Get next token from JSON
    t, err := d.Token()
    if err != nil {
        return err
    }

    delim, ok := t.(json.Delim)

    // There's nothing to do for simple values (strings, numbers, bool, nil)
    if !ok {
        return nil
    }

    switch delim {
    case '{':
        keys := make(map[string]bool)
        for d.More() {
            // Get field key
            t, err := d.Token()
            if err != nil {
                return err
            }
            key := t.(string)

            // Check for duplicates
            if keys[key] {
                fmt.Printf("Duplicate %s\n", strings.Join(append(path, key), "/"))
            }
            keys[key] = true

            // Check value
            if err := check(d, append(path, key)); err != nil {
                return err
            }
        }
        // Consume trailing }
        if _, err := d.Token(); err != nil {
            return err
        }

    case '[':
        i := 0
        for d.More() {
            if err := check(d, append(path, strconv.Itoa(i))); err != nil {
                return err
            }
            i++
        }
        // Consume trailing ]
        if _, err := d.Token(); err != nil {
            return err
        }

    }
    return nil
}
以下是如何称呼它:

data := `{"a": "b", "a":true,"c":["field_3 string 1","field3 string2"], "d": {"e": 1, "e": 2}}`
if err := check(json.NewDecoder(strings.NewReader(data)), nil); err != nil {
    log.Fatal(err)
}
输出为:

Duplicate a
Duplicate d/e

您可能可以使用
json.Compact
删除多余的空格。我想OP问的是“如何检测重复属性”,而不是“如何检测是否存在重复属性”
Duplicate a
Duplicate d/e