2014-12-02 12 views
8

đây là file jsonLàm thế nào để thay đổi giá trị trong một tệp json sử dụng XPath/JsonPath trong java

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

Tôi muốn thay đổi giá trị của name.by trực tiếp cho XPath/JsonPath Giống như

($.session.name).changevalue("MYSESSINID") đây chỉ là một ví dụ

tôi một cách chính xác sử dụng thư viện jackson và sử dụng mã dưới đây để đọc qua 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); 

như vậy là một cách để thay đổi tên của XPath

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

vẫn trong file nó không làm việc.

+0

PropertyUtils cũng có phương thức setProperty, bạn đã thử điều đó chưa? – flup

+0

@flup setProperty mã không hoạt động của nó không đưa ra bất kỳ lỗi nhưng nó không thay đổi giá trị hoặc – vaibhavcool20

+0

Cây đối tượng chỉ sống trong bộ nhớ. Vì vậy, sau khi bạn thay đổi giá trị trong cây đối tượng, bạn phải tuần tự hóa nó trở lại tệp. – flup

Trả lời

16

Sử dụng Jayways JsonPath bạn có thể:

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

Bạn có thể cấu hình các JsonProvider mặc định, do đó bạn không cần phải vượt qua nó trong tất cả các cuộc gọi.

+0

Tôi đã thử giải pháp của bạn nhưng nó được thiết lập một giá trị số như chuỗi. Bất kỳ giải pháp cho điều này? ví dụ: cố gắng đặt số lượng đăng nhập thành 1, nó được trả lại là: "loginCount": "1" – InCh

+0

Oh tìm thấy giải pháp! Vượt qua đối tượng số nguyên để đặt làm int – InCh

3
PropertyUtils.setProperty(jsonObj, "session.value", "new value"); 
     PropertyUtils.setProperty(jsonObj, "session.name", "new name"); 
     mapper.writeValue(Json File ,jsonObj); 
Các vấn đề liên quan