为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Qyouu 2022-06-13 16:49:31
我正在尝试解组一些嵌套的 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 }
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

问题是可能有几个不同的属性结构,我不能全部提供


看起来您的 JSON 数据可以有一组具有相似值 ( Attribute) 的键,而您无法知道数据中可能有多少键。


对于这种情况,您可以使用 amap[string]json.RawMessage作为起始实体来解组


var e map[string]json.RawMessage

if err := json.Unmarshal([]byte(jsonData), &e); err != nil {

    panic(err)

}

然后,您可以在值范围内查看是否可以将它们解组为Attribute类型


for k, v := range e {

    var a Attribute

    if err := json.Unmarshal(v, &a); err == nil {

        log.Printf("Got attribute %s: %s", k, string(v))

    }

}


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信