如何使用JayWay JsonPath向JSON数组中插入JSON对象?
正确使用JayWay JsonPath向JSON数组插入对象的方法
我正在使用JayWay JsonPath操作JSON对象,想要将一个JSON对象插入到JSON数组中,期望效果如下:
操作前
{ "students": [] }
操作后
{ "students": [{"id": 1, "name": "Bob"}] }
但尝试了两种方式都没成功:
问题1:传入字符串导致插入的是字符串而非JSON对象
var context = JsonPath.parse("{\"students\": []}"); context.add("students", "{\"id\": 1, \"name\": \"Bob\"}"); System.out.println(context.jsonString()); // 输出: {"students":["{\"id\": 1, \"name\": \"Bob\"}"]}
问题2:传入JsonPath解析上下文得到空对象
var context = JsonPath.parse("{\"students\": []}"); context.add("students", JsonPath.parse("{\"id\": 1, \"name\": \"Bob\"}")); System.out.println(context.jsonString()); // 输出: {"students":[{}]}
正确解决方案
context.add()方法需要接收Java对象或已解析的JSON节点数据,而非字符串或JsonPath上下文对象,以下是几种可行方式:
方式1:将JSON字符串解析为Map后添加
var context = JsonPath.parse("{\"students\": []}"); // 解析JSON字符串为Map类型的对象 Map<String, Object> student = JsonPath.parse("{\"id\": 1, \"name\": \"Bob\"}").read("$"); context.add("students", student); System.out.println(context.jsonString()); // 输出: {"students":[{"id":1,"name":"Bob"}]}
方式2:通过JsonProvider构建JSON对象
var context = JsonPath.parse("{\"students\": []}"); JsonProvider provider = JsonProviderFactory.createProvider(); // 创建空的JSON对象 Object student = provider.createMap(); // 为对象设置属性 provider.set(student, "id", 1); provider.set(student, "name", "Bob"); context.add("students", student); System.out.println(context.jsonString()); // 输出: {"students":[{"id":1,"name":"Bob"}]}
方式3:使用自定义实体类对象
如果有对应的实体类,直接传入实体对象即可:
// 定义实体类 class Student { private int id; private String name; public Student(int id, String name) { this.id = id; this.name = name; } // 需提供getter方法,否则序列化可能失败 public int getId() { return id; } public String getName() { return name; } } // 使用实体类插入 var context = JsonPath.parse("{\"students\": []}"); context.add("students", new Student(1, "Bob")); System.out.println(context.jsonString()); // 输出: {"students":[{"id":1,"name":"Bob"}]}
为什么之前的方法失败?
- 传入字符串时,JsonPath会将其视为普通字符串值处理,不会自动解析为JSON对象。
- 传入
JsonPath.parse()返回的DocumentContext时,JsonPath无法正确序列化该上下文对象,因此得到空对象。
内容的提问来源于stack exchange,提问作者Elias Schoof
相关产品推荐
相关产品推荐

