我试图查看.json文件是否有多个相同的密钥
"gauge1":{
"name":"someName",
"name":"someName1"
}
有没有办法检查json中的键'name'
是否被多次使用?
如果您使用同名的多个密钥解组json文件,它将重写以前写入的密钥,gauge1.name
将成为someName1
任何帮助都将不胜感激,谢谢!
答案 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>