Muszę zmienić wartość atrybutu JSON w Javie, mogę poprawnie uzyskać wartość, ale nie mogę zmodyfikować JSON.
oto kod poniżej
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
}
}
}
Jaki jest najlepszy sposób, aby to zrobić?
resultMap = mapper.convertValue(aJsonNode, Map.class);
Zmodyfikować ją w mapie, a następnie zmienić tę mapę z powrotem na JsonNode. Tylko mówię.Odpowiedzi:
JsonNode
jest niezmienna i jest przeznaczona do operacji analizowania. Można go jednak rzucić naObjectNode
(iArrayNode
), które pozwalają na mutacje:W przypadku tablicy możesz użyć:
źródło
Exception in thread "main" java.lang.ClassCastException: com.fasterxml.jackson.databind.node.IntNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
Dodając odpowiedź, ponieważ niektórzy inni głosowali za w komentarzach do zaakceptowanej odpowiedzi, dostają ten wyjątek podczas próby rzutowania do ObjectNode (włącznie ze mną):
Rozwiązaniem jest pobranie węzła „nadrzędnego” i wykonanie
put
efektywnej zamiany całego węzła, niezależnie od oryginalnego typu węzła.Jeśli chcesz „zmodyfikować” węzeł przy użyciu istniejącej wartości węzła:
get
wartość / tablica plikuJsonNode
put
do rodzica.Kod, którego celem jest modyfikacja
subfield
, który jest węzłem potomnymNodeA
iNode1
:Kredyty:
Stąd czerpałem inspirację dzięki wassgreen @
źródło
Odpowiedź @ Sharon-Ben-Asher jest w porządku.
Ale w moim przypadku dla tablicy muszę użyć:
źródło
Myślę, że możesz po prostu przesłać do ObjectNode i użyć
put
metody. Lubię toObjectNode o = (ObjectNode) jsonNode; o.put("value", "NO");
źródło
Musisz pobrać
ObjectNode
obiekt typu, aby ustawić wartości. Spójrz na toźródło
Tylko ze względu na zrozumienie innych, którzy mogą nie uzyskać pełnego obrazu, następujący kod działa dla mnie, aby znaleźć pole, a następnie je zaktualizować
źródło