将匿名json字段解组为“命名”字段

时间:2019-03-26 15:19:07

标签: go

说我有以下json

{
    "unknown": {
        "knownArray": [
            {"property": "somevalue", "otherproperty": false}
        ],
        "otherKnownArray": [""]
    }
}

我用以下结构表示此数据

type Model struct {
    ObjectName string
    KnownArray []KnownType `json:"knownArray"`
    OtherKnownArray []string `json:"otherKnownArray"`
}

type KnownType struct {
    Property string `json:"property1"`
    Otherproperty bool   `json:"otherproperty"`
}

var model Model

json.Unmarshal(content, &model)

不幸的是,不会反序列化任何json。

如何正确反序列化我的模型?
如何反序列化json,以便ObjectName =“ unknown”?

对于匿名json字段,我不太了解encoding / json的内部。

我也尝试过将模型包装在第三个“外部”模型中,但仍无法与匿名json字段一起使用。

1 个答案:

答案 0 :(得分:2)

可以使用map [string] Model进行编码。 https://play.golang.org/p/QWXQZFjBgRB

package main

import (
    "fmt"
    "encoding/json"
)

type Model struct {
    ObjectName string
    KnownArray []KnownType `json:"knownArray"`
    OtherKnownArray []string `json:"otherKnownArray"`
}

type KnownType struct {
    Property string `json:"property"`
    Otherproperty bool   `json:"otherproperty"`
}

func main() {
        jsonstring := `{
            "unknown": {
                "knownArray": [
                        {"property": "somevalue", "otherproperty": false}
                ],
                "otherKnownArray": [""]
            }
    }`
    a := make(map[string]Model)
    json.Unmarshal([]byte(jsonstring), &a)
    var m Model
    for k, v := range(a) {
        m = v
        m.ObjectName = k
        break
    }
    fmt.Println(m.ObjectName, m.KnownArray, m.OtherKnownArray)
}