我有一个需求,我需要更新JSON中的值。我需要更新的键的路径也是基于一些条件,所以我必须在属性文件中维护路径。这是我的JSON
String jsonString = "{\"delivery_codes\": [{\"postal_code\": {\"district\": \"District1\", \"pin\": 201001, \"pre_paid\": \"Y\", \"cash\": \"Y\", \"pickup\": \"Y\", \"repl\": \"N\", \"cod\": \"Y\", \"is_oda\": \"N\", \"sort_code\": \"GB\", \"state_code\": \"UP\"}}]}";
现在我的要求是假设我需要更新pre_paid的值到N,但需要pre_paid的路径是动态的,因为有时我可能需要更新state_code或sort_code或pre_paid等。所以我使用JSONPath:
String jsonPathExpressionForDistrict = "$['delivery_codes'][0]['postal_code']['district']";
String jsonPathExpressionForState_code = "$['delivery_codes'][0]['postal_code']['state_code']";
我需要将这些路径存储在一些属性文件/DB中。
我能够通过以下代码读取属性:
JsonPath.parse(jsonString).read(jsonPathExpressionForDistrict , JsonNode.class) -> This gives me value 'District1'
但当我尝试使用以下代码更新值时:
JsonPath.parse(jsonString).put(jsonPathExpressionForDistrict , "District2", String.class);
这给了我以下错误:
线程“main”com中出现异常。乱穿马路。jsonpath。InvalidModificationException:只能在com向映射添加属性。乱穿马路。jsonpath。内部的PathRef$ObjectPropertyPathRef。把(PathRef.java:265)放到com上。乱穿马路。jsonpath。JsonPath。将(JsonPath.java:304)放在com上。乱穿马路。jsonpath。内部的JsonContext。将(JsonContext.java:221)放在com上。乱穿马路。jsonpath。内部的JsonContext。将(JsonContext.java:199)放在com。。服务ServiceImpl。main(ServiceImpl.java:179)
请有人在这方面指导我。
使用org.json库。
组织。JSON
您可以获取JSONArray并获取数组中项目的键。
你可以得到这样一个项目:
array.getJSONObject(i).getInt("postal_code");
在本例中,i是JSONArray中的项。
祝你好运
当您需要更新已经存在的节点的值时,您应该使用set方法。我希望下面的片段有所帮助:
String jsonString = "{\"delivery_codes\": [{\"postal_code\": {\"district\": \"District1\", \"pin\": 201001, \"pre_paid\": \"Y\", \"cash\": \"Y\", \"pickup\": \"Y\", \"repl\": \"N\", \"cod\": \"Y\", \"is_oda\": \"N\", \"sort_code\": \"GB\", \"state_code\": \"UP\"}}]}";
String jsonPathExpressionForDistrict = "$['delivery_codes'][0]['postal_code']['district']";
String jsonPathExpressionForState_code = "$['delivery_codes'][0]['postal_code']['state_code']";
DocumentContext documentContext = JsonPath.parse(jsonString);
System.out.println(documentContext.jsonString());
String read = documentContext.read(jsonPathExpressionForDistrict);
System.out.println(read);
documentContext.set(jsonPathExpressionForState_code, "District2");
System.out.println(documentContext.jsonString());
我知道已经很晚了,但也许这可以帮助其他人。OP得到该错误是因为valuejsonPathExpressionForDistrict
是指向属性的路径,而不是JSON对象或映射。
要将地区2
添加到邮政编码
,路径应为“$['delivery\u codes'][0]['postal\u code']”
。
要使用JSonPath更新/添加JSON中的任何值,我们可以使用本文中提到的方法,但是需要检查并确保路径在源JSON对象中有效。
我使用JavaFX Scene Builder1.1创建了一个FXML文件。默认情况下创建AnchorPane。为什么我不能修改resizable属性?
我用“Hello World bare Bones”开始了一个代号为One的项目。我以前在设计器的主题选项卡中定义样式,但现在变得乏味了。 实际上,对于某些选择器,即使重写(取消选中框)某些属性,设计器(见下文)或应用程序本身也不会更改样式。 然而,在选择器列表中,颜色不是我选择的颜色,但对齐方式似乎是它。 任何帮助都很感激,
假设我有一个非常简单的PHP CRUD系统来管理数据库。假设它有一个产品列表。使用Doctrine ORM,我想查询数据库并查看/编辑/添加记录。根据入门手册, 创建实体类时,所有字段都应该是受保护的或私有的(不是公共的),每个字段都有getter和setter方法(除了$id)。使用变异子可以让条令钩住调用,这些调用以一种如果直接使用entity#field=foo设置值就无法实现的方式操纵实体
我正在尝试设置React组件中的状态,以便它在子组件的输入值发生变化时进行更改。我可以console.log和并获得预期的字符串,但是我不能编译这个函数: 我很困惑,因为我在我的。 我的getInitialState是:
我在Ubuntu中安装JDK有困难,我不能让它工作。谁能让我知道我做错了什么? 1-我从Oracle的网站下载了jdk-6u35-linux-i586.bin 2-我将下载的文件移到了家里/ 3-我使用chmod+x jdk-6u35-linux-i586.bin将其转换为可执行文件 4-我使用sudo./jdk1.6.0_35执行它 5-我使用mv jdk1.6.0_35//usr/local/
问题内容: 如果我尝试写 有语法错误。使用双点,放置一个空格,将三个放在括号中或使用括号表示法可以使其正常工作。 为什么单点表示法不起作用,我应该使用其中一种替代方法? 问题答案: 句点是数字的一部分,因此代码将解释为: 这自然会产生语法错误,因为您不能立即在数字后面加上标识符。 任何使周期不被解释为数字一部分的方法都可以使用。我认为最清楚的方法是在数字周围加上括号: