2014-01-09 30 views
0

Jackson非常適合在POJO和json字符串之間進行翻譯。但使用它來操作json字符串是一件痛苦的事情。我發現自己在做類似的東西:Jackson上的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

你在做什麼就好。如果有的話,如果你知道它是一個JSON對象,那麼將'node'的聲明類型設置爲'ObjectNode'並且轉換'readTree'的返回值。 –

+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對象中。