大致思路:序列化未知json放入一个interface{}中再通过反射将其内容解析出来
1 str1:=`{ 2 "generic_id": 882, 3 "platform": 12, 4 "priority": 262, 5 "region": 31, 6 "type": 105, 7 "type_id": 0, 8 "type_key": "testnow" 9 } ` 10 11 //获取多个value的方法 12 func GetValues(i interface{}, keys *[]string, values *map[string][]interface{}) (err error) { 13 if i == nil { 14 logger.Warn("[GetValues] 接口value存在nil值") 15 return 16 } 17 typeName, v := reflect.TypeOf(i), reflect.ValueOf(i) 18 if typeName.Kind() == reflect.Map { 19 vKeys := v.MapKeys() 20 for _, vKey := range vKeys { 21 val := v.MapIndex(vKey) 22 valKind := reflect.TypeOf(val.Interface()).Kind() 23 for _, key := range *keys { 24 if vKey.String() == key { 25 (*values)[key] = append((*values)[key], val.Interface()) 26 } 27 } 28 if valKind == reflect.Map || valKind == reflect.Slice { 29 err = GetValues(val.Interface(), keys, values) 30 if err != nil { 31 return 32 } 33 } 34 } 35 } else if typeName.Kind() == reflect.Slice { 36 for j := 0; j < v.Len(); j++ { 37 err = GetValues(v.Index(j).Interface(), keys, values) 38 if err != nil { 39 return 40 } 41 } 42 } 43 return 44 }
测试例子
func TestGetValues(t *testing.T) { keys := []string{“generic_id", "type", "region"} var i interface{} if err := json.Unmarshal([]byte(str1), &i); err != nil { fmt.Sprintf("json.unmarshal错误!") } r := &map[string][]interface{}{} err := GetValues(i, &keys, r) if err != nil { logger.Errorf("err:%s", err) return } for _, v := range keys { fmt.Println(v) fmt.Println((*r)[v]) } }