Java'da JsonNode nasıl değiştirilir?


109

Java'da bir JSON özniteliğinin değerini değiştirmem gerekiyor, değeri doğru bir şekilde alabiliyorum ancak JSON'u değiştiremedim.

işte aşağıdaki kod

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

Bunu yapmanın en iyi yolu nedir?


1
JsonNode'u bir Java Haritasına dönüştürebilirsiniz, örneğin Harita'da resultMap = mapper.convertValue(aJsonNode, Map.class);değiştirebilir ve sonra bu Haritayı tekrar JsonNode'a değiştirebilirsiniz. Sadece söylüyorum.
MikeJRamsey56

Yanıtlar:


198

JsonNodedeğişmezdir ve ayrıştırma işlemi için tasarlanmıştır. Bununla birlikte, mutasyonlara izin veren ObjectNode(ve ArrayNode) içine dökülebilir :

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

Bir dizi için şunları kullanabilirsiniz:

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

4
değerini değiştirmem gereken sayısal bir tür için denedim. Bu istisnayı aldım: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

"
IntNode

6

Kabul edilen cevabın yorumlarına başkaları tarafından olumlu oy verildiği için bir cevap ekleyerek, bu istisnayı ObjectNode'a aktarmaya çalışırken (ben de dahil) alıyorlar:

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

Çözüm, 'ana' düğümü elde etmek ve putorijinal düğüm türünden bağımsız olarak tüm düğümü etkin bir şekilde değiştirerek bir gerçekleştirmektir .

Düğümün mevcut değerini kullanarak düğümü "değiştirmeniz" gerekiyorsa:

  1. get değeri / dizisi JsonNode
  2. Değişikliğinizi bu değer / dizi üzerinde gerçekleştirin
  3. putEbeveyni aramaya devam edin.

Kod, amacın değiştirmek subfieldolduğu, alt düğümü olan NodeAve Node1:

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

Kredi:

Bu ilhamı wassgreen @ sayesinde buradan aldım


5

@ Sharon-Ben-Asher yanıtı tamam.

Ama benim durumumda, bir dizi için kullanmam gereken:

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

4

Sanırım sadece ObjectNode'a çevirebilir ve putyöntemi kullanabilirsiniz . Bunun gibi

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


2

ObjectNodeDeğerleri ayarlamak için tip nesnesi almanız gerekir . Bir göz atın bu


0

Sadece resmin tamamını net bir şekilde anlayamayabilecek başkalarını anlamak uğruna, aşağıdaki kodu bir alan bulup sonra güncellemem için çalışıyor

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");
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.