Golang 解析嵌套Json中的所有value
作者:互联网
有一段Json数据,该Json数据中所有key对应的value值有各种类型,包括:数字、字符(串)、布尔值,以及由这些简单类型组成的对象,数组等,并且是多层嵌套的。前端将该Json解析后根据不同的key,将对应的value内容以不同的样式和布局展现。此时如果需要去除样式,在只需要value内容的时候(比如value值要作为被检索的内容时,其中的样式以及Json中无用的字符是要去掉的),就需要将Json中所有的value找出来并拼接成字符串。这里提供一种思路:
步骤一:确定Json中所有的key名及所有层级的嵌套关系,并定义相应的嵌套结构体,并设置每个key的Json标签,与Json数据中的key名对应;
步骤二:利用Golang原生方法(例:Json字符串变量名为:dataJson,结构体对象变量名为:dataStruct),将Json字符串转化为结构体对象:
dataBytes := []byte(dataJson)
err := json.Unmarshal(dataBytes, &dataStruct)
if err != nil {
return err
}
步骤三:利用Golang的反射原理,递归查找结构体对象中每个元素的最下层的内容。由于Json的最基本类型是数字、字符(串)、布尔值,所以结构体各元素最下层内容也是数字、字符(串)、布尔值。如果是(结构体)对象或(切片)数组,则继续递归拆分元素,直到取到数字、字符(串)、布尔值为止,最后返回一个字符串。实现如下:
func getValueFromStruct(dataStruct interface{}) string {
// 用于存放最基本类型(数字、字符串、布尔值)的内容
var bodyBuffer bytes.Buffer
reflectValue := reflect.ValueOf(dataStruct)
// 根据数据类型判断是否需要继续往下递归
reflectValueType := reflectValue.Kind()
if reflect.Struct == reflectValueType {
reflectType := reflect.TypeOf(dataStruct)
// 遍历对象中的每个字段的值,获取value内容
fieldsCount := reflectType.NumField()
for i := 0; i < fieldsCount; i++ {
// 反射类型的对象经过Interface方法变为实际的对象,再次调用自己进行解析
value := reflectValue.Field(i).Interface()
valueStr := getValueFromStruct(value)
bodyBuffer.WriteString(valueStr + " ")
}
} else if reflect.Slice == reflectValueType {
// 遍历切片数组中的每个元素,获取value内容
sliceLength := reflectValue.Len()
for i := 0; i < sliceLength; i++ {
// 反射类型的对象经过Interface方法变为实际的对象,再次调用自己进行解析
value := reflectValue.Index(i).Interface()
valueStr := getValueFromStruct(value)
bodyBuffer.WriteString(valueStr + " ")
}
} else if reflect.Int64 == reflectValueType {
// 根据结构体定义的数值类型,将数值转为字符串并追加到结果字符串,用空格分隔,避免直接连接时在全文检索时不拆词产生badcase
int64Str := strconv.FormatInt(reflectValue.Int(), 10)
bodyBuffer.WriteString(int64Str + " ")
} else {
// 字符串类型则直接追加到结果字符串,用空格分隔,避免直接连接时在全文检索时不拆词产生badcase
valueStr := reflectValue.String()
if "" != valueStr {
bodyBuffer.WriteString(valueStr + " ")
}
}
return bodyBuffer.String()
}
标签:reflectValue,value,Golang,bodyBuffer,Json,字符串,valueStr 来源: https://blog.csdn.net/lzghxjt/article/details/114949484