簡體   English   中英

Golang JSON序列化/反序列化

[英]Golang JSON Serialization/Deserialization

我有一個結構如下:

type Node struct {
    Name     string
    Children []*Node
    Values   []string
}

我也有一組描述我的樹的json文件,例如:

{
  "something": {
    "someblah": [
      "fluf",
      "glah"
    ],
    "someother": {
      "someotter": [
        "blib",
        "fnar"
      ]
    }
  }
}

如何將這些文件反序列化為結構?

我發現的所有示例似乎都需要帶有命名鍵/值對的不同結構。

為此,結構是關鍵:

  • 關鍵是結構名稱
  • 地圖內容是兒童
  • 列表內容是值

我不明白如何將此邏輯映射到golang json序列化程序中。

最簡單的方法是解碼為map [string] interface {}並將其轉換為所需的結構:

var m map[string]interface{}
err := json.Unmarshal(data, &m)
if err != nil {
    // handle error
}
node := convert(m, "")

...

func convert(name string, m map[string]interface{}) *Node {
    n := Node{Name: name}
    for k, v := range m {
        switch v := v.(type) {
        case []interface{}:
            nn := Node{Name: k}
            for _, e := range v {
                s, ok := e.(string)
                if !ok {
                    panic(fmt.Sprintf("expected string, got %T", e))
                }
                nn.Values = append(nn.Values, s)
            }
            n.Children = append(n.Children, &nn)
        case map[string]interface{}:
            n.Children = append(n.Children, convert(k, v))
        default:
            panic("unexpected type")
        }
    }
    return &n
}

convert函數遇到意外類型的值時,它將驚慌。 根據您的應用程序的要求,您可能要忽略這些值或返回錯誤。

在操場上跑

暫無
暫無

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

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