解组时,检查JSON对象是否具有相同键的倍数

时间:2016-07-28 18:20:52

标签: json go

我试图查看.json文件是否有多个相同的密钥

"gauge1":{
    "name":"someName",
    "name":"someName1"
}

有没有办法检查json中的键'name'是否被多次使用? 如果您使用同名的多个密钥解组json文件,它将重写以前写入的密钥,gauge1.name将成为someName1

任何帮助都将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:3)

您可以创建一个json.Unmarshaler字符串类型,如果在解组时分配了多次,则会返回错误。

type singleAssignString string

func (s *singleAssignString) UnmarshalJSON(b []byte) error {
    if s != nil && *s != "" {
        return fmt.Errorf("multiple string assignment")
    }

    *s = singleAssignString(string(b))
    return nil
}

https://play.golang.org/p/v4L1EjTESX

使用json.Decoder处理此问题可能只是为了正确获取所有字段并返回正确的错误消息。您可以使用外部类型的UnmarshalJSON方法中的嵌入式解码器来完成此操作。一个粗略的例子可能如下:

type Data struct {
    Name string
}

func (d *Data) UnmarshalJSON(b []byte) error {
    dec := json.NewDecoder(bytes.NewReader(b))

    key := ""
    value := ""

    for dec.More() {
        tok, err := dec.Token()
        if err != nil {
            return err
        }

        s, ok := tok.(string)
        if !ok {
            continue
        }

        switch {
        case key == "":
            key = s
            continue
        case value == "":
            value = s
        }

        if key == "Name" {
            if d.Name != "" {
                return fmt.Errorf("multiple assignment to Name")
            }
            d.Name = s
        }

        key = ""

    }
    return nil
}

答案 1 :(得分:1)

据说你应该使用encoding/json包的低级解码工具 - 即它的Decoder类型,其方法Token()迭代输入JSON流中的所有标记。

结合状态机和映射(或映射层次结构)来保存已解析的值,此方法将允许您检查是否已在要解析的JSON对象中看到具有相同名称的兄弟字段。 / p>