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的最基本类型是数字、字符(串)、布尔值,所以结构体各元素最下层内容也是数字、字符(串)、布尔值。如果是(结构体)对象或(切⽚)数组,则继续递归拆分元素,直到取到数字、字符(串)、布尔值为⽌,最后返回⼀个字符串。实现如下:
// 获取结构体中所有最基本类型(数字、布尔值、字符串)的value数据并拼成字符串,⽤空格分隔func getValueFromStruct(dataStruct interface{}) string {
var dataBuffer bytes.Buffer
reflectValue := reflect.ValueOf(dataStruct)
// 根据数据最底层类型判断是否需要继续往下递归
reflectKind := reflectValue.Kind()
if reflect.Struct == reflectKind {
// 如果是结构体类型,遍历对象中的每个字段的值,获取value内容
fieldsCount := reflectValue.NumField()
for i := 0; i < fieldsCount; i++ {
// 反射类型的对象经过Interface⽅法变为实际的对象,再次调⽤⾃⼰进⾏解析
value := reflectValue.Field(i).Interface()
valueStr := getValueFromStruct(value)
dataBuffer.WriteString(valueStr + " ")
}
} else if reflect.Slice == reflectKind {
// 如果是切⽚类型,遍历切⽚数组中的每个元素,获取value内容
sliceLength := reflectValue.Len()
for i := 0; i < sliceLength; i++ {
/
/ 反射类型的对象经过Interface⽅法变为实际的对象,再次调⽤⾃⼰进⾏解析
itemValue := reflectValue.Index(i).Interface()
valueStr := getValueFromStruct(itemValue)
dataBuffer.WriteString(valueStr + " ")
}
} else if reflect.Int64 == reflectKind {
// 如果是数值类型,根据结构体定义的数值类型,将数值转为字符串并追加到结果字符串
int64Str := strconv.FormatInt(reflectValue.Int(), 10)
dataBuffer.WriteString(int64Str + " ")
} else if reflect.Bool == reflectKind {
// 如果是布尔类型,将布尔值转为字符串并追加到结果字符串
boolStr := strconv.FormatBool(reflectValue.Bool())
dataBuffer.WriteString(boolStr + " ")
} else {
// 如果是字符串类型,直接追加到结果字符串
json值的类型有哪些
valueStr := reflectValue.String()
if "" != valueStr {
dataBuffer.WriteString(valueStr + " ")
}
}
return dataBuffer.String()
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。