猿问

解组具有不同结构但相同键的嵌套 JSON

我正在尝试解组一些嵌套的 JSON,如下所示:


{

    "id": "aRandomId",

    "type": "aRandomType",

    "aRandomField": {

        "type": "someType",

        "createdAt": "2020-07-07T15:50:02",

        "object": "anObject",

        "modifiedAt": "2020-07-07T15:50:02"

    },

    "aParameter": {

        "type": "Property",

        "createdAt": "2020-07-07T15:50:02",

        "value": "myValue",

        "modifiedAt": "2020-07-07T15:50:02"

    },

    "location": {

        "type": "GeoProperty",

        "value": {

            "type": "Point",

            "coordinates": [

                7.0054,

                40.9999

            ]

        }

    },

     ... other things with type, value ...


    "createdAt": "2020-07-07T15:50:02",

    "modifiedAt": "2020-07-07T15:50:02",

}


我想获取所有键和值:类型、createdAt、值(如果它们是嵌套的)


实际上,我有 2 个结构:


type Attribute struct {

    Type       string `json:"type"`

    CreatedAt  string `json:"createdAt"`

    Value      string `json:"value"`

    ModifiedAt string `json:"modifiedAt"`

}


type Entity struct {

    Id        string `json:"id"`

    Type      string `json:"type"`

    CreatedAt string `json:"createdAt"`

    Attribute Attribute

}



in := []byte(buf.String())

    var entity Entity

    err := json.Unmarshal(in, &entity)

    if err != nil {

        panic(err)

    }


    frame.Fields = append(frame.Fields,

        data.NewField("key", nil, []string{"type : ", "createdAt : ", "name : "}),

    )

    frame.Fields = append(frame.Fields,

        data.NewField("value", nil, []string{entity.Type, entity.CreatedAt, entity.Attribute.Value}),

    )

问题是可能有几个不同的属性结构,我不能全部提供它们。我想在一帧中显示所有键(仅类型、createdAt 和值),并在另一帧中显示它们的所有值。


也许有类似的东西?


type Entity struct {

    attribute List<Attribute>

}

type Attribute struct{

    Type       string 

    CreatedAt  string 

    Value      string 

    ModifiedAt string 

}


Qyouu
浏览 142回答 1
1回答

PIPIONE

问题是可能有几个不同的属性结构,我不能全部提供看起来您的 JSON 数据可以有一组具有相似值 ( Attribute) 的键,而您无法知道数据中可能有多少键。对于这种情况,您可以使用 amap[string]json.RawMessage作为起始实体来解组var e map[string]json.RawMessageif err := json.Unmarshal([]byte(jsonData), &e); err != nil {&nbsp; &nbsp; panic(err)}然后,您可以在值范围内查看是否可以将它们解组为Attribute类型for k, v := range e {&nbsp; &nbsp; var a Attribute&nbsp; &nbsp; if err := json.Unmarshal(v, &a); err == nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Printf("Got attribute %s: %s", k, string(v))&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答