Làm thế nào để sửa đổi JsonNode trong Java?


109

Tôi cần thay đổi giá trị của thuộc tính JSON trong Java, tôi có thể lấy giá trị đúng cách nhưng tôi không thể sửa đổi JSON.

đây là mã bên dưới

  JsonNode blablas = mapper.readTree(parser).get("blablas");
    for (JsonNode jsonNode : blablas) {
        String elementId = jsonNode.get("element").asText();
        String value = jsonNode.get("value").asText();
        if (StringUtils.equalsIgnoreCase(elementId, "blabla")) {
            if(value != null && value.equals("YES")){
                 // I need to change the node to NO then save it into the JSON
            }
        }
    }

Cách tốt nhất để làm việc này là gì?


1
Bạn có thể chuyển đổi JsonNode thành Bản đồ Java, ví dụ: resultMap = mapper.convertValue(aJsonNode, Map.class);sửa đổi nó trong Bản đồ và sau đó thay đổi Bản đồ đó trở lại thành JsonNode. Chỉ nói.
MikeJRamsey56

Câu trả lời:


195

JsonNodelà bất biến và dành cho hoạt động phân tích cú pháp. Tuy nhiên, nó có thể được đúc thành ObjectNode(và ArrayNode) cho phép đột biến:

((ObjectNode)jsonNode).put("value", "NO");

Đối với một mảng, bạn có thể sử dụng:

((ObjectNode)jsonNode).putArray("arrayName").add(object.ge‌​tValue());

4
đã thử cho một kiểu số mà tôi cần thay đổi giá trị. Tôi có ngoại lệ này:Exception in thread "main" java.lang.ClassCastException: com.fasterxml.jackson.databind.node.IntNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
balboa_21

Bạn cần thử "IntNode"
mulya

6

Thêm một câu trả lời khi một số người khác đã ủng hộ trong các nhận xét của câu trả lời được chấp nhận, họ nhận được ngoại lệ này khi cố gắng truyền tới ObjectNode (bao gồm cả tôi):

Exception in thread "main" java.lang.ClassCastException: 
com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

Giải pháp là lấy nút 'cha' và thực hiện putthay thế hiệu quả toàn bộ nút, bất kể loại nút ban đầu.

Nếu bạn cần "sửa đổi" nút bằng cách sử dụng giá trị hiện có của nút:

  1. get giá trị / mảng của JsonNode
  2. Thực hiện sửa đổi của bạn trên giá trị / mảng đó
  3. Tiến hành gọi putphụ huynh.

Mã, nơi mục tiêu là sửa đổi subfield, là nút con của NodeANode1:

JsonNode nodeParent = someNode.get("NodeA")
                .get("Node1");

// Manually modify value of 'subfield', can only be done using the parent.
((ObjectNode) nodeParent).put('subfield', "my-new-value-here");

Tín dụng:

Tôi lấy cảm hứng này từ đây , nhờ wassgreen @


5

Câu trả lời @ Sharon-Ben-Asher là ok.

Nhưng trong trường hợp của tôi, đối với một mảng, tôi phải sử dụng:

((ArrayNode) jsonNode).add("value");

4

Tôi nghĩ rằng bạn chỉ có thể truyền sang ObjectNode và sử dụng putphương thức. Như thế này

ObjectNode o = (ObjectNode) jsonNode; o.put("value", "NO");


2

Bạn cần lấy ObjectNodeđối tượng kiểu để đặt giá trị. Hãy xem cái này


0

Chỉ vì lợi ích của sự hiểu biết của những người khác, những người có thể không hiểu toàn bộ bức tranh rõ ràng, mã sau đây hoạt động để tôi tìm một trường và sau đó cập nhật nó

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(JsonString);    
JsonPointer valueNodePointer = JsonPointer.compile("/GrandObj/Obj/field");
JsonPointer containerPointer = valueNodePointer.head();
JsonNode parentJsonNode = rootNode.at(containerPointer);

if (!parentJsonNode.isMissingNode() && parentJsonNode.isObject()) {
    ObjectNode parentObjectNode = (ObjectNode) parentJsonNode;
    //following will give you just the field name. 
    //e.g. if pointer is /grandObject/Object/field
    //JsonPoint.last() will give you /field 
    //remember to take out the / character 
    String fieldName = valueNodePointer.last().toString();
    fieldName = fieldName.replace(Character.toString(JsonPointer.SEPARATOR), StringUtils.EMPTY);
    JsonNode fieldValueNode = parentObjectNode.get(fieldName);

    if(fieldValueNode != null) {
        parentObjectNode.put(fieldName, "NewValue");
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.