2014-12-02 13 views
8

tutaj jest plik jsonJak zmienić wartości w pliku json przy użyciu XPath/JsonPath w java

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

chcę zmienić wartość name.by bezpośrednio dając XPath/JsonPath odczuwalna

($.session.name).changevalue("MYSESSINID") to tylko przykład

mam poprawnie przy użyciu biblioteki Jackson i stosując poniższy kod do czytania poprzez 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); 

więc jest ich sposobem na zmianę nazwy przez XPath

PropertyUtils.setProperty(jsonObj, "session.value", "new value"); 

nadal w pliku jej nie działa.

+0

PropertyUtils ma również metodę setProperty, czy próbowałeś tego? – flup

+0

@flup setProperty kod nie działa, nie daje żadnego błędu, ale nie zmienia wartości albo – vaibhavcool20

+0

Drzewo obiektów żyje tylko w pamięci. Więc po zmianie wartości w drzewie obiektów, musisz serializować go z powrotem do pliku. – flup

Odpowiedz

16

Korzystanie Jayways JsonPath można:

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

Można skonfigurować domyślny JsonProvider więc nie trzeba przekazać go we wszystkich połączeń.

+0

Próbowałem Twojego rozwiązania, ale ustawiam wartość liczbową jako ciąg. Jakieś rozwiązanie tego? np: próbował ustawić liczbę logowania na 1, został zwrócony jako: "loginCount": "1" – InCh

+0

Oh znalazłem rozwiązanie! Przekaż obiektowi całkowitemu, aby ustawić jako int – InCh

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