序列化为JSON动态结构

时间:2017-08-07 12:40:21

标签: go

使用JSON的所有示例都描述了如何序列化为JSON简单或用户类型(如结构)。

但我有不同的情况:a)我不知道我的类型/对象的字段b)每个对象都有不同的类型。

这是我的伪代码案例:

while `select * from item` do
  while `select fieldname, fieldvalue from fields where fields.itemid = item.id` do
    ...

对于我数据库中的每个实体,我获得字段名称和字段值。结果我需要得到这样的东西:

{
  "item.field1": value,
  ...
  "item.fieldN": value,
  "custom_fields": {
     "fields.field1": value,
      ...
     "fields.fieldK": value
  }
}

Go中最好的方法是什么?标准库中是否有任何有用的库或函数?

更新:数据来源是数据库。在结果中,我需要将JSON作为字符串发送到外部Web服务。因此,程序只是从数据库读取数据并向REST服务发出POST请求。

1 个答案:

答案 0 :(得分:1)

你的目标类型应该是什么?它不是一个结构,因为你事先不知道这些字段。

对我来说唯一合适的类型似乎是map map[string]interface{}类型:可以实现任何嵌套结构:

a := map[string]interface{}{
    "item.field1": "val1",
    "item.field2": "val2",
    "item.fieldN": "valN",
    "custom_fields": map[string]interface{}{
        "fields.field1": "cval1",
        "fields.field2": "cval2",
    },
}
b, err := json.Marshal(a)

请参阅playground sample here

如您所暗示的那样从数据库中填充此结构应该是自定义脚本(不使用json)。

注意:custom_fields也可以是其他类型,具体取决于值列在数据库中的类型。如果value列是字符串,请使用map[string]string