gpt4 book ai didi

json - 将 JSON 解码为具有独特元素的 map slice

转载 作者:行者123 更新时间:2023-12-05 03:16:54 27 4
gpt4 key购买 nike

我正在将一些 json 文件解码为 []map[string]string{}但很多时候源是脏的,有许多重复的相等对象。

输入看起来像:

[{"sa1":"8172"},{"sa3":"8175"},{"sa1":"8172"},{"sa3":"8175"},{"sa3 ":"8175"},{"sa3":"8175"},{"sa1":"8172"},{"sa3":"8175"},{"sa3":"8175"}]

导致:

map[sa1:8172]
([]map[string]string) (len=9 cap=9) {
(map[string]string) (len=1) {
(string) (len=3) "sa1": (string) (len=4) "8172"
},
(map[string]string) (len=1) {
(string) (len=3) "sa3": (string) (len=4) "8175"
},
(map[string]string) (len=1) {
(string) (len=3) "sa1": (string) (len=4) "8172"
},
(map[string]string) (len=1) {
(string) (len=3) "sa3": (string) (len=4) "8175"
},
(map[string]string) (len=1) {
(string) (len=3) "sa3": (string) (len=4) "8175"
},
(map[string]string) (len=1) {
(string) (len=3) "sa3": (string) (len=4) "8175"
},
(map[string]string) (len=1) {
(string) (len=3) "sa1": (string) (len=4) "8172"
},
(map[string]string) (len=1) {
(string) (len=3) "sa3": (string) (len=4) "8175"
},
(map[string]string) (len=1) {
(string) (len=3) "sa3": (string) (len=4) "8175"
}
}

我如何清理 map slice 以仅包含唯一元素?

最佳答案

一种选择是将键值对直接解码为可比较的类型,如结构:

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

关于json - 将 JSON 解码为具有独特元素的 map slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74403623/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com