2014-12-02 24 views
8

這裏使用XPath/JsonPath一個JSON文件值是JSON文件如何更改在Java

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

我想改變name.by直接給予的XPath/JsonPath像

($.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"); 

還是它不工作的文件中更改名稱的方式。

+0

PropertyUtils也有一個setProperty方法,你試過了嗎? – flup 2014-12-02 08:03:05

+0

@flup setProperty代碼不起作用它沒有給出任何錯誤,但它不改變值 – vaibhavcool20 2014-12-02 08:56:48

+0

對象樹只存在於內存中。因此,在更改對象樹中的值後,必須將其序列化迴文件。 – flup 2014-12-02 09:01:41

回答

16

使用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所以你不必把它傳遞的所有呼叫。

+0

我試過你的解決方案,但它將字符串設置爲數字值。任何解決方案?例如:試圖將登錄計數設置爲1,它返回爲:「loginCount」:「1」 – InCh 2016-12-28 10:52:50

+0

哦,找到了解決方案!將整數對象設置爲int – InCh 2016-12-28 11:10:08

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