其他分享
首页 > 其他分享> > Golang 解析嵌套Json中的所有value

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