有没有一种方法可以根据内容动态解组json? [英] Is there a way to dynamically unmarshal json base on content?

查看:49
本文介绍了有没有一种方法可以根据内容动态解组json?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的json格式

I have a json format that looks like this

{
    "my_object_list": [
        {
            "meta": {"version": 1},
            "my_value": {// Some complex value
            }
        }
        {
            "meta": {"version": 2},
            "my_value": {// Some complex value
            }
        }
    ]
}

我希望能够根据 meta 封送每个 my_value ,有没有办法在golang中实现这一目标?

I want to be able to marshal each of the my_value base on meta is there a way to achieve that in golang?

type MyResponse struct {
    // how to I unmarshal each myObject base on version?
    MyObjectList     []myObject   `json:"my_object_list"`
}

推荐答案

将可变部分解组为 json.RawMessage .遍历数据并将原始消息数据解组为基于版本的类型.

Unmarshal the varying part to a json.RawMessage. Loop through the data and unmarshal the raw message data to a type based on the version.

type V1Value struct{}

type myObject struct {
    Meta struct {
        Version int `json:"version"`
    } `json:"meta"`
    RawValue json.RawMessage `json:"my_value"`
    Value    interface{} `json:"-"`
}

type MyResponse struct {
    MyObjectList []*myObject `json:"my_object_list"`
}


...

var response MyResponse
if err := json.Unmarshal(data, &response); err != nil {
     // handle error
}
for _, o := range response.MyObjectList {
    switch o.Meta.Version {
    case 1:
        var v V1Value
        if err := json.Unmarshal(o.RawValue, &v); err != nil {
            // handle error
        }
        o.Value = v
    default:
        // handle unknown version
    }
}

这篇关于有没有一种方法可以根据内容动态解组json?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆