Golang 解析嵌套Json中的所有value

2 篇文章 0 订阅

        有一段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 {
		// 如果是字符串类型,直接追加到结果字符串
		valueStr := reflectValue.String()
		if "" != valueStr {
			dataBuffer.WriteString(valueStr + " ")
		}
	}
	return dataBuffer.String()
}

步骤四:解析出来的字符串中有可能还含有Markdow标记、Html标记等,如果也要去除,请参考:https://blog.csdn.net/lzghxjt/article/details/114951445

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值