it-swarm.com.de

Wie modifiziere ich JsonNode in Java?

Ich muss den Wert eines JSON-Attributs in Java ändern. Ich kann den Wert richtig abrufen, aber ich konnte den JSON nicht ändern.

hier ist der Code unten 

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

Was ist der beste Weg, dies zu tun?

67
mstfdz

JsonNode ist unveränderlich und für die Analyse bestimmt. Es kann jedoch in ObjectNode (und ArrayNode) umgewandelt werden, die Mutationen zulassen:

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

Für ein Array können Sie Folgendes verwenden:

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

Ich denke, Sie können einfach zu ObjectNode wechseln und die put-Methode verwenden. So was 

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

2
Xdsasdf

Sie müssen ein ObjectNode-Objekt abrufen, um die Werte festzulegen .. _. Schauen Sie sich this an.

1
Eugen Halca

Hinzufügen einer Antwort, wie sie einige andere in den Kommentaren der akzeptierten Antwort hochgestuft haben. Sie erhalten diese Ausnahme, wenn sie versuchen, sie in ObjectNode umzuwandeln (ich selbst eingeschlossen):

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

Die Lösung besteht darin, den übergeordneten Knoten abzurufen und eine put auszuführen, die den gesamten Knoten unabhängig vom ursprünglichen Knotentyp ersetzt.

Wenn Sie den Knoten mit dem vorhandenen Wert des Knotens "modifizieren" müssen:

  1. get der Wert/das Array der JsonNode
  2. Führen Sie Ihre Änderung an diesem Wert/Array durch
  3. Rufen Sie dann put für das übergeordnete Element auf.

Code, in dem das Ziel darin besteht, subfield zu ändern. Dabei handelt es sich um den untergeordneten Knoten von NodeA und 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");

Credits:

Ich habe diese Inspiration von hier , dank wassgreen @

0
matrixanomaly

Die Antwort von @ Sharon-Ben-Asher ist in Ordnung.

Aber in meinem Fall muss ich für ein Array Folgendes verwenden:

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