web-dev-qa-db-ja.com

java)でXPath / JsonPathを使用してjsonファイルの値を変更する方法

これがjsonファイルです

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

XPath/JsonPath Likeを直接指定して、name。の値を変更したい

($.session.name).changevalue("MYSESSINID")これは単なる例です

私はジャクソンライブラリを正しく使用しており、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");

まだファイル内で機能していません。

12
vaibhavcool20

Jayways JsonPath を使用すると、次のことができます。

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());
}

デフォルトのJsonProviderを構成して、すべての呼び出しで渡す必要がないようにすることができます。

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