2015-02-19 14 views
10

Il mio obiettivo è aggiornare alcuni campi testuali in un JsonNode.Come posso sostituire un TextNode Java Jackson con un altro (aggiornamento)?

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

Io non vedo come questo potrebbe essere fatto. Hai qualche suggerimento?

+1

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

+0

Non ho POJO che rappresenta la mia JSON. Devo davvero fare tutto questo per aggiornare un semplice textNode ?? !! –

+0

Vedere anche: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers e http://www.baeldung.com/jackson-deserialization –

risposta

13

La risposta breve è: non è possibile. TextNode non espone alcuna operazione che consente di modificare il contenuto.

Con ciò detto, è possibile attraversare facilmente i nodi in un ciclo o tramite ricorsione per ottenere il comportamento desiderato. Immaginate la seguente:

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

L'output è:

{ "fieldName": "nuovo valore", "annidati": { "fieldName": "nuovo valore"}}

+0

Grazie per il codice. Quello che finalmente ho fatto è stato il loop su jsonNode e la costruzione di un StringBuilder con valori che volevo. –

+0

@yo_haha, fantastico! Assicurati di sfuggire correttamente alle stringhe se non usi JsonNode! – wassgren

1

Poiché non è possibile modificare un TextNode, è possibile ottenere tutti i parentNodes di quel campo e richiamare l'operazione put su di esso con lo stesso nome di campo e un nuovo valore. Sostituirà il campo esistente e modificherà il valore.

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

È sempre meglio aggiungere una spiegazione al codice che stai postando come risposta, in modo che possa aiutare i visitatori a capire perché questa è una buona risposta. – abarisone

+1

@abarisone - Poiché il codice era auto esplicativo, non ho fornito una spiegazione. L'ho messo adesso, per favore controlla se sembra buono. –

Problemi correlati