将 JSON 解组为具有独特元素的地图切片

我正在解组一些 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"

 }

}

我如何清理地图切片以仅包含唯一元素?


拉风的咖菲猫
浏览 156回答 1
1回答

慕侠2389804

一种选择是将键值对直接解组为可比较的类型,如结构: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 []Elemfunc (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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go