1 回答
TA贡献1719条经验 获得超6个赞
一种选择是将键值对直接解组为可比较的类型,如结构:
type Elem struct {
k string
v string
}
func (e *Elem) UnmarshalJSON(d []byte) error {
m := map[string]string{}
if err := json.Unmarshal(d, &m); err != nil {
return err
}
for k, v := range m {
e.k = k
e.v = v
return nil
}
return nil
}
一旦您可以单独比较元素,您还可以将其包装在一个集合中,该集合在解组时过滤元素。是在这里隐含地这样做,还是在事后这样做是一个见仁见智的问题。使过滤成为自己的方法可能是更好的关注点分离,但UnmarshalJSON为了简洁起见,我将其包含在内。
type Elems []Elem
func (e *Elems) UnmarshalJSON(d []byte) error {
tmp := []Elem{}
err := json.Unmarshal(d, &tmp)
if err != nil {
return err
}
seen := map[Elem]bool{}
for _, elem := range tmp {
if seen[elem] {
continue
}
seen[elem] = true
*e = append(*e, elem)
}
return nil
}
然后你可以解组成Elems:
elems := Elems{}
err := json.Unmarshal(js, &elems)
if err != nil {
log.Fatal(err)
}
fmt.Println(elems)
这会给你两个独特的对:[{sa1 8172} {sa3 8175}]
https://go.dev/play/p/U0iqBAjvz-1
- 1 回答
- 0 关注
- 121 浏览
添加回答
举报