2015-02-19 12 views
10

Mein Ziel ist es, einige Textfelder in einem JsonNode zu aktualisieren.Wie kann ich einen Java Jackson TextNode durch einen anderen ersetzen (Update)?

List<JsonNode> list = json.findValues("fieldName"); 
    for(JsonNode n : list){ 
     // n is a TextNode. I'd like to change its value. 
    } 

Ich sehe nicht, wie dies getan werden könnte. Hast du irgendwelche Vorschläge?

+1

Hast du http://stackoverflow.com/questions/17967531/jackson-api-partially-update-a-string –

+0

sehe ich nicht POJO, die meine Json darstellt. Muss ich wirklich alles tun, um einen einfachen textNode zu aktualisieren? !! –

+0

Siehe auch: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers und http://www.baeldung.com/jackson-deserialization –

Antwort

13

Die kurze Antwort lautet: Sie können nicht. TextNode stellt keine Operationen zur Verfügung, mit denen Sie den Inhalt ändern können.

Mit diesem gesagt, können Sie die Knoten in einer Schleife oder durch Rekursion leicht durchlaufen, um das gewünschte Verhalten zu erhalten. Stellen Sie sich folgendes:

public class JsonTest { 
    public static void change(JsonNode parent, String fieldName, String newValue) { 
     if (parent.has(fieldName)) { 
      ((ObjectNode) parent).put(fieldName, newValue); 
     } 

     // Now, recursively invoke this method on all properties 
     for (JsonNode child : parent) { 
      change(child, fieldName, newValue); 
     } 
    } 

    @Test 
    public static void main(String[] args) throws IOException { 
     String json = "{ \"fieldName\": \"Some value\", \"nested\" : { \"fieldName\" : \"Some other value\" } }"; 
     ObjectMapper mapper = new ObjectMapper(); 
     final JsonNode tree = mapper.readTree(json); 
     change(tree, "fieldName", "new value"); 
     System.out.println(tree); 
    } 
} 

Die Ausgabe lautet:

{ "fieldname": "neuer Wert", "verschachtelt": { "fieldname": "neuer Wert"}}

+0

Danke für den Code. Was ich schließlich getan habe, war, den jsonNode zu durchlaufen und einen StringBuilder mit den gewünschten Werten zu konstruieren. –

+0

@yo_haha, großartig! Stellen Sie sicher, dass Sie die Strings ordnungsgemäß umgehen, wenn Sie JsonNode nicht verwenden! – wassgren

1

Da Sie einen TextNode nicht ändern können, können Sie stattdessen alle parentNodes dieses Feldes abrufen und die put-Operation mit demselben Feldnamen und einem neuen Wert aufrufen. Es wird das vorhandene Feld ersetzen und den Wert ändern.

List<JsonNode> parentNodes = jsonNode.findParents("fieldName"); 
if(parentNodes != null) { 
    for(JsonNode parentNode : parentNodes){ 
    ((ObjectNode)parentNode).put("fieldName", "newValue"); 
    } 
} 
+1

Es ist immer besser, dem Code, den Sie als Antwort veröffentlichen, eine Erklärung hinzuzufügen, damit die Besucher verstehen, warum dies eine gute Antwort ist. – abarisone

+1

@abarisone - Weil der Code selbsterklärend war, habe ich keine Erklärung abgegeben. Ich habe es jetzt gestellt, bitte überprüfe, ob es gut aussieht. –