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 關注
- 153 瀏覽
添加回答
舉報