为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
拉风的咖菲猫 2023-03-15 14:27:46
我正在解组一些 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" }}我如何清理地图切片以仅包含唯一元素?
查看完整描述

1 回答

?
慕侠2389804

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


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信