问题我面临着从 json 对象中删除不需要的数组的问题,例如。仅包含一个元素的数组,该元素不是对象或数组。(没有数组作为输入的根)例子在:{"name": [{ "inner": ["test"] }]}通缉:{"name": [{ "inner": "test" }]}方法我从对 a 的值进行简单的类型切换开始map[string]interface{},并认识到它不会切换到 case []map[string]interface{}。(给出例子)这是我想出的实现。它适用于大多数场景,但不适用于数组中的内部对象。type jsonMap map[string]interface{}type jsonMapList []map[string]interface{}m := jsonMap{}err := json.Unmarshal(s, &m)if err != nil { panic(err)}res := removeFromObject(m)bytes, err := json.Marshal(res)if err != nil { panic(err)}result := string(bytes)log.Infof("Parse Result: %s", result)func removeFromObject(in jsonMap) jsonMap { res := jsonMap{} for k, v := range in { switch value := v.(type) { case jsonMap: res[k] = removeFromObject(value) case jsonMapList: list := []jsonMap{} for _, entry := range value { list = append(list, removeFromObject(entry)) } res[k] = list case []interface{}: if len(value) == 1 { res[k] = value[0] } else { res[k] = value } default: res[k] = value } } return res}问题如何将大小写切换为对象数组,以便我也可以递归解析该数组中的对象?
1 回答
LEATH
TA贡献1936条经验 获得超6个赞
您可以使用此函数删除不需要的数组。
func removearr(x interface{}) interface{} {
switch val := x.(type) {
case map[string]interface{}:
for k, v := range val {
val[k] = removearr(v)
}
return val
case []interface{}:
if len(val) == 1 {
// remove array only if the value is not an object
if _, ok := val[0].(map[string]interface{}); !ok {
return removearr(val[0])
}
}
for i, v := range val {
val[i] = removearr(v)
}
return val
default:
return x
}
}
https://play.golang.com/p/mwo7Y2rJ_lc
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报
0/150
提交
取消