考虑以下输入:
"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;?
编辑:这是实际用例:
换句话说,这个翻译人员就像两个服务中间人一样。鉴于其快速启动时间和快速JSON处理,Go似乎是一个很好的选择。
我不认为详细描述Go结构中的每个JSON字段,因为我只需要更改几个字段。我愿意因为反射而在效率上做出权衡(解析为map[string]interface{}
应该比使用完整的结构更慢),以换取使代码对JSON输入的变体更通用
答案 0 :(得分:0)
更改
j["object"]["array"][i]
到
j["object"].(map[string]interface{})["array"].([]interface{})[i]