改json字符串中层级比较深的一个值

潜心研究终于出了一个可以复用的函数:

# coding=utf-8
import json
import types

class Bjson(object):
	def __init__(self):
		pass

	def getValue(self,json,arr):
		for key in arr:
			if(type(key)==types.UnicodeType):
				key=str(key)
			json=json[key]
		return json

	def upValue(self,json,arr,value):
		tarr=arr[::-1]
		temp=self.getValue(json,tarr[:0:-1])
		keyname=tarr[0]
		if(type(keyname)==types.UnicodeType):
			keyname=str(keyname)
		temp[keyname]=value
		for i in range(1,len(tarr)):
			a=i
			keyname=tarr[i]
			if(type(keyname)==types.UnicodeType):
				keyname=str(keyname)
			temp_a=self.getValue(json,tarr[:a:-1])
			temp_a[keyname]=temp
			temp=temp_a
		return temp

怎么用呢?很简单:

json:这个是原json内容

keypath:是字段的路径

value:需要改之后的值

json={"as":[{"aa":"bb","bb":"bb","name":"zhangsan"}{"aa":"bb","bb":"bb","name":"zhangsan"}]}
keypath=["as",0,"name"]
value="lisi"
BJ=Bjson()
newjson=BJ.upValue(json,keypath,value)

输出结果是:

{"as":[{"aa":"bb","bb":"bb","name":"zhangsan"}{"aa":"bb","bb":"bb","name":"zhangsan"}]}

 

转载于:https://my.oschina.net/hibony/blog/769804

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用JavaJson解析库Jackson或者Gson来解析Json字符串。假设我们要获取所有层级key为"param"的,可以按照以下步骤进行: 1. 将Json字符串转化为JsonNode对象或JsonObject对象 ``` // 使用Jackson库将Json字符串转化为JsonNode对象 JsonNode jsonNode = new ObjectMapper().readTree(jsonString); // 使用Gson库将Json字符串转化为JsonObject对象 JsonObject jsonObject = new Gson().fromJson(jsonString, JsonObject.class); ``` 2. 编写递归函数,遍历JsonNode对象或JsonObject对象的所有节点,查找key为"param"的 ``` // 使用Jackson库的JsonNode对象遍历 private void findParamValue(JsonNode node) { if (node.isObject()) { // 如果当前节点是对象 Iterator<String> fieldNames = node.fieldNames(); // 获取所有字段名 while (fieldNames.hasNext()) { // 遍历所有字段 String fieldName = fieldNames.next(); JsonNode childNode = node.get(fieldName); // 获取当前字段对应的节点 if (childNode.isObject() || childNode.isArray()) { // 如果当前节点是对象或数组 findParamValue(childNode); // 继续递归遍历 } else if (fieldName.equals("param")) { // 如果当前字段是"param" String paramValue = childNode.asText(); // 获取"param"的 // TODO: 处理"param"的 } } } else if (node.isArray()) { // 如果当前节点是数组 for (JsonNode childNode : node) { // 遍历数组的所有元素 if (childNode.isObject() || childNode.isArray()) { // 如果当前节点是对象或数组 findParamValue(childNode); // 继续递归遍历 } } } } // 使用Gson库的JsonObject对象遍历 private void findParamValue(JsonObject obj) { for (Map.Entry<String, JsonElement> entry : obj.entrySet()) { // 遍历所有键对 String key = entry.getKey(); JsonElement value = entry.getValue(); if (value.isJsonObject() || value.isJsonArray()) { // 如果当前是对象或数组 findParamValue(value); // 继续递归遍历 } else if (key.equals("param")) { // 如果当前键是"param" String paramValue = value.getAsString(); // 获取"param"的 // TODO: 处理"param"的 } } } ``` 3. 调用递归函数进行遍历 ``` // 使用Jackson库的JsonNode对象遍历 findParamValue(jsonNode); // 使用Gson库的JsonObject对象遍历 findParamValue(jsonObject); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值