如何在java中使用XPath/JsonPath更改json文件中的值

如何在java中使用XPath/JsonPath更改json文件中的值,java,json,xpath,jackson,jsonpath,Java,Json,Xpath,Jackson,Jsonpath,这是json文件 { "session": { "name":"JSESSIONID", "value":"5864FD56A1F84D5B0233E641B5D63B52" }, "loginInfo": { "loginCount":77, "previousLoginTime":"2014-12-02T11:11:58.561+05

这是json文件

{
    "session":
        {
            "name":"JSESSIONID",
            "value":"5864FD56A1F84D5B0233E641B5D63B52"
        },
    "loginInfo":
        {
            "loginCount":77,
            "previousLoginTime":"2014-12-02T11:11:58.561+0530"
        }
}
我想通过直接给XPath/JsonPath指定

($.session.name).changevalue(“mysessind”)
这只是一个例子

我正确地使用了jackson库,并使用下面的代码通过XPath进行阅读

ObjectMapper mapper = new ObjectMapper();

        Object jsonObj=mapper.readValue(new File(Json file), Object.class);
        Object name=PropertyUtils.getProperty(jsonObj, "session.name");
        System.out.println("Name:"+name);
那么,它们是通过XPath更改名称的一种方法吗

PropertyUtils.setProperty(jsonObj, "session.value", "new value");
仍然在文件中,它不工作。

使用您可以:

PropertyUtils.setProperty(jsonObj, "session.value", "new value");
        PropertyUtils.setProperty(jsonObj, "session.name", "new name");
        mapper.writeValue(Json File ,jsonObj);

您可以配置默认的JsonProvider,这样就不必在所有调用中传递它。

这是我找到的在Json内部进行交换的最简单方法(当我的正文JSONObject时)


PropertyUtils也有一个setProperty方法,您尝试过吗?@flup setProperty代码不工作,没有给出任何错误,但没有更改值。对象树仅存在于内存中。因此,在更改对象树中的值后,必须将其序列化回文件。@flup
PropertyUtils.setProperty(jsonObj,“session.name”,“lkihilh”);writeValue(json文件,jsonObj);这将在一个文件中写入整个json代码。如果文件很大,则会消耗大量时间。如果文件很大,则将其读入内存将占用大量内存,而写入将占用大量时间。事情就是这样;)这是你真正的问题吗?如何以流式方式编辑JSON文件,甚至在硬盘上进行编辑?或者仅仅是如何使用Jackson和PropertyUtils实现这一点?我尝试了您的解决方案,但它将一个数值设置为字符串。有什么解决办法吗?例如:试图将登录计数设置为1,结果返回为:“loginCount”:“1”哦找到了解决方案!传递integer对象以设置为Int如果多个节点匹配怎么办?看起来需要像“forEach”这样的自定义处理程序,它可以处理任何类型的节点。请注意,这仅在指定的键已存在的情况下有效。遗憾的是,
mapper
未定义,因此无法工作。
private static final Configuration configuration = Configuration.builder()
    .jsonProvider(new JacksonJsonNodeJsonProvider())
    .mappingProvider(new JacksonMappingProvider())
    .build();

@Test
public void a_value_can_be_updated(){

    String originalJson = "{\n"
        + "\"session\":\n"
        + "    {\n"
        + "        \"name\":\"JSESSIONID\",\n"
        + "        \"value\":\"5864FD56A1F84D5B0233E641B5D63B52\"\n"
        + "    },\n"
        + "\"loginInfo\":\n"
        + "    {\n"
        + "        \"loginCount\":77,\n"
        + "        \"previousLoginTime\":\"2014-12-02T11:11:58.561+0530\"\n"
        + "    }\n"
        + "}";

    JsonNode updatedJson = JsonPath.using(configuration).parse(originalJson).set("$.session.name", "MYSESSINID").json();

    System.out.println(updatedJson.toString());
}
JsonPath.parse(Body).set(fieldPath, Value);