簡體   English   中英

在 Go 中解組 JSON 數組

[英]Unmarshal JSON Array in Go

我在這里閱讀了一些答案,但似乎沒有任何幫助。 我不斷收到同樣的錯誤:

json:無法將數組解組為 A 類型的 Go 值

type A struct {
    Arr []string
}

type MA []A
func UnmarshalJSON() (ma MA, err error) {
    jsonFile, err := os.Open(aJsonFile)
    // error handling
    defer jsonFile.Close()
    byteValue, _ := ioutil.ReadAll(jsonFile)
    err = json.Unmarshal(byteValue, &ma)
    if err != nil {
        return ma, err
    }
    return ma, nil
}

json 看起來像這樣:

[
  ["Name", "Another Name", "Another"],
  ["A", "B"],
  ["W", "X", "Y", "Z"],
  ["Foo", "Bar"]
]

我在搜索時嘗試了各種不同的方法,如前所述,沒有任何效果。

我對 Go 仍然很陌生,並且不得不解組東西(我目前正在解組到[][]string ,但我想使用結構)。 我究竟做錯了什么?

結構有字段; 字段有名稱; 結構中字段的名稱是Arr 所以 json 輸入需要是[{ "arr": ["list", "of", "names"]}, {"arr": ["more", "names"]}]例如,給定你上面的例子。

但是,您可以在名為A類型上定義 UnmarshalJSON,如下所示:

func (p *A) UnmarshalJSON(data []byte) error {
    var s []string
    err := json.Unmarshal(data, &s)
    if err != nil {
        return err
    }
    p.Arr = s
    return nil
}

這個名為UnmarshalJSON的接收器 function 采用指向A object 的指針,以及某種有效的 json 輸入。 它的工作是解組 json。 在這種情況下,我們嘗試解組為一個普通的string切片——變量s只要 json 本身字符串切片的有效初始化程序,它就可以工作。

如果解組成功,我們將設置p.Arr ,知道該數組僅用於名為Arr的事物(實際上是結構類型的唯一成員)並返回nil (無錯誤)。

注意最后幾行可以寫成:

if err == nil {
    p.Arr = s
}
return err

這更短,但 Go 約定通常首先處理錯誤情況,而不是讓它通過。 (實際上,我自己更喜歡較短的代碼,但請使用您的團隊喜歡的任何代碼。)

(給定類型上的UnmarshalJSON接收器,該類型上可能也應該有一個 json 編組器,但我在 Go 操場上的最小測試和示例沒有。)

您的 json 內容應該是這樣的

[
    {
        "Arr": [
            "a0",
            "a1"
        ]
    },
    {
        "Arr": [
            "b0",
            "b1"
        ]
    },
    {
        "Arr": [
            "c0",
            "c1"
        ]
    }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM