2014-01-09 3 views
0

Jackson отлично подходит для перевода POJO и json строк. Но больно использовать его для управления json-строкой. Я считаю, что делаю такие вещи, как:Json манипуляции над Jackson

ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(ReadFile("testObj.json")); 
((ObjectNode)node).put("testField", "newTestValue"); 
TestObject obj = mapper.readValue(mapper.writeValueAsString(node), TestObject.class); 

И это простой пример. Это становится более сложным, если вы хотите добавить новый объект или массив вещей. Есть лучший способ сделать это?

+0

Что вы делаете, все в порядке. Если что-либо, установите объявленный тип 'node'' ObjectNode' и введите возвращаемое значение 'readTree', если вы знаете, что это объект JSON. –

+0

Похоже, вы хотите изменить входной JSON и после этого десериализовать его в свой класс POJO, не так ли? –

ответ

2

Я не понимаю, что так сложно. Если вы уверены, что ваш корневой JSON является объектом JSON, просто введите значение, возвращаемое ObjectMapper#readTree(..), в ObjectNode и манипулируйте им.

String json = "{\"sample\": \"some value\", \"nested\": {\"prop\": 123, \"nestedArray\":[1,2, \"string value\"], \"array\":[null, 42]}}"; 
ObjectNode node = (ObjectNode) new ObjectMapper().readTree(json); 
System.out.println(node); 
ArrayNode arrayNode = node.putArray("new array"); 
arrayNode.add(true).add(1).add("new value"); // chain add calls 
arrayNode.addObject().put("nestedInArray", "nested object value"); // add an object and add to it 
System.out.println(node); 

печатает

{"sample":"some value","nested":{"prop":123,"nestedArray":[1,2,"string value"],"array":[null,42]}} 
{"sample":"some value","nested":{"prop":123,"nestedArray":[1,2,"string value"],"array":[null,42]},"new array":[true,1,"new value",{"nestedInArray":"nested object value"}]} 

Обратите внимание, что вы также можете добавить свои пользовательские объекты тоже. Они обычно будут обернуты в объекты POJONode.