IT

Java에서 JsonNode를 수정하는 방법은 무엇입니까?

lottoking 2020. 9. 7. 08:27
반응형

Java에서 JsonNode를 수정하는 방법은 무엇입니까?


Java에서 JSON 속성 값을 변경해야합니다. JSON을 멋지게 만들 수 있습니다.

다음은 아래 코드입니다.

  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
            }
        }
    }

이를 수행하는 가장 좋은 방법은 무엇입니까?


JsonNode변경 불가능하며 구문 분석 작업을위한 것입니다. 그러나 변형을 허용하는 ObjectNode(및 ArrayNode) 로 캐스팅 할 수 있습니다 .

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

배열의 경우 다음을 사용할 수 있습니다.

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

@ Sharon-Ben-Asher 대답은 괜찮습니다.

하지만 제 경우에는 배열을 배열합니다.

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

ObjectNode로 캐스팅하고 put메서드를 사용할 수 있습니다. 이렇게

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


당신은 얻을 필요가 ObjectNode설정 값에 순서대로 입력 개체를. 이것 좀 봐


다른 사람들이 수락 한 답변의 주석에서 답변을 추가하면 ObjectNode (내가 포함)로 캐스팅 할 때 예외가 발생합니다.

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

해결은 '상위'노드를 가져옵니다 put원래 노드 유형에 노드를 전체 노드를 대체하는 수행하는 입니다.

노드의 기존 값을 사용하여 노드를 "수정"해야하는 경우 :

  1. get 가치 / 배열 JsonNode
  2. 해당 값 / 배열에 대한 수정을 수행하십시오.
  3. 계속 put해서 부모 에게 전화 하십시오.

subfield의 하위 노드 인 을 수정하는 것이 목표 인 코드 :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");

신용 :

wassgreen @ 덕분에 ... 여기서 영감을 얻었습니다.


전체 그림을 명확하게 이해하지 못해 다른 사람들을 이해하기 위해 다음 코드가 필드를 다음 업데이트하는 데 있습니다.

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

참고 URL : https://stackoverflow.com/questions/30997362/how-to-modify-jsonnode-in-java

반응형