我想从org.json
转到org.codehaus.jackson
。如何转换以下Java代码?
private JSONObject myJsonMessage(String message){
JSONObject obj = new JSONObject();
obj.put("message",message);
return obj;
}
为简单起见,我遗漏了try-catch
块。
答案 0 :(得分:19)
而不是JSONObject
使用杰克逊的ObjectMapper
和ObjectNode
:
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("message", "text");
这将是杰克逊相当于您当前的org.json
代码。
然而,杰克逊真正擅长的是它能够在你的Java类(POJO)和它们的JSON表示之间进行复杂映射,以及它的流API,它允许你进行真正快速的序列化,至少与{ {1}}的同行。
答案 1 :(得分:5)
Jackson api中没有JSONObject
。您可以返回一个Map或Java Bean,而不是返回JSONObject
,而是返回包含getter和setter的message属性。
public class MyMessage {
private String message;
public void setMessage(final String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
}
因此,您的方法将简化为:
private MyMessage(String message) {
MyMessage myMessage = new MyMessage();
myMessage.setMessage(message);
return myMessage;
}
此更改的另一个方面是更改序列化代码,将MyMessage转换回json字符串。 Jackson默认使用Java Beans,地图,您不需要创建JSONObject
例如
private String serializeMessage(MyMessage message){
//Note: you probably want to put it in a global converter and share the object mapper
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(message);
}
以上内容将返回{message: "some message"}
为简洁起见,我跳过了例外情况。
答案 2 :(得分:1)
如果您想逐件从org.json
库升级到Jackson
,并且最初保留相同的API,则可能需要阅读“Upgrade from org.json to Jackson”。
这至少会使您的代码在基本JSON读写方面快3倍;加上你可以 - 如果你这样选择 - 开始转换处理,因为杰克逊可以很容易地在树和POJO之间进行转换(ObjectMapper.treeToValue(...)
,valueToTree
,convertValue
在POJO之间等等)
请记住,您熟悉的工具可能会使您的思维偏向某些模式,保持开放的思维可以帮助您找到更好的模式。 对于Jackson(或GSON或其他成熟的Java JSON工具),您应该考虑正确的数据绑定可以提供哪些帮助,而不是使用以JSON为中心的树模型(org.json提供)。树模型使您的思维基于JSON结构,这有时是有用的;但也可能会阻止您看到更多自然模式,这些模式来自定义POJO结构以反映预期的JSON,并直接在Java对象上运行。