2014-01-09 2 views
0

잭슨은 POJO와 json 문자열 사이를 변환하는 데 적합합니다. 그러나 json 문자열을 조작하는 데 사용하는 것은 고통입니다. 나는 다음과 같은 것을하고있다.잭슨 위의 Json 조작

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'로 설정하고 그것이 JSON 객체라는 것을 안다면'readTree'의 반환 값을 던지십시오. –

+0

입력 JSON을 변경하고 POJO 클래스로 deserialize 한 다음에는 그렇지 않습니까? –

답변

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 개체로 래핑됩니다.