亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 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 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號