当前位置: 首页 > 知识库问答 >
问题:

为什么我不能使用Jayway JsonPath设置json属性的值?

黄查猛
2023-03-14

我有一个需求,我需要更新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)

请有人在这方面指导我。

共有3个答案

程阳平
2023-03-14

使用org.json库。

组织。JSON

您可以获取JSONArray并获取数组中项目的键。

你可以得到这样一个项目:

array.getJSONObject(i).getInt("postal_code");

在本例中,i是JSONArray中的项。

祝你好运

毋胜涝
2023-03-14

当您需要更新已经存在的节点的值时,您应该使用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());
酆鸿哲
2023-03-14

我知道已经很晚了,但也许这可以帮助其他人。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/

  • 问题内容: 如果我尝试写 有语法错误。使用双点,放置一个空格,将三个放在括号中或使用括号表示法可以使其正常工作。 为什么单点表示法不起作用,我应该使用其中一种替代方法? 问题答案: 句点是数字的一部分,因此代码将解释为: 这自然会产生语法错误,因为您不能立即在数字后面加上标识符。 任何使周期不被解释为数字一部分的方法都可以使用。我认为最清楚的方法是在数字周围加上括号: