Go - 动态修改JSON

时间:2015-05-27 20:31:14

标签: json go

考虑以下输入:

"object": {
  "array": [
    {
      "element_field_1": some_value_1,
      "element_field_2": some_value_1,
      ... // More unknown fields
    },
    ...
  ],
  "object_field": foo,
  ... // Some more unknown fields
}

我需要遍历数组的每个元素,修改字段1和2,然后输出JSON对象。这就是我现在拥有的东西,但它远非有效Go代码:

func handler(w http.ResponseWriter, r *http.Request) {
    // Transform the request's body to an interface
    j := getDecodedJSON(r)

    // Iterate over every element of the array
    for i := 0; i < len(j["object"]["array"]); i++ {
        rewrite(j["object"]["array"][i])
    }

    // Encoding back to JSON shouldn't be a problem
}

func getDecodedJSON(r *http.Request) map[string]interface{} {
    dec := json.NewDecoder(r.Body)
    var j map[string]interface{}
    if err := dec.Decode(&j); err != nil {
        log.Fatal(err)
    }
    return j
}

func rewrite(element *map[string]interface{}) {
    element["element_field_1"], element["element_field_2"] = lookupValues(element)
}

基本上错误是:

invalid operation: j["object"]["array"] \
(type interface {} does not support indexing)

但当然,我的方法存在一个更概念性的错误。

写一个详细说明输入内容的struct并不是一个选项,因为我事先并不知道JSON键。

我该怎么做?#34; Go way&#34;?

编辑:这是实际用例:

  • 我有两个需要&#34;翻译的网络服务&#34;他们之间。
  • 服务1向翻译人员发出请求,其中修改了几个字段,其他所有字段保持不变。
  • 然后,翻译者获取修改后的JSON并将请求复制到服务2。

换句话说,这个翻译人员就像两个服务中间人一样。鉴于其快速启动时间和快速JSON处理,Go似乎是一个很好的选择。

我不认为详细描述Go结构中的每个JSON字段,因为我只需要更改几个字段。我愿意因为反射而在效率上做出权衡(解析为map[string]interface{}应该比使用完整的结构更慢),以换取使代码对JSON输入的变体更通用

1 个答案:

答案 0 :(得分:0)

更改

j["object"]["array"][i]

j["object"].(map[string]interface{})["array"].([]interface{})[i]