从org.json JSONObject到org.codehaus.jackson

时间:2012-09-21 23:45:17

标签: java json jackson

我想从org.json转到org.codehaus.jackson。如何转换以下Java代码?

private JSONObject myJsonMessage(String message){
    JSONObject obj = new JSONObject();
    obj.put("message",message);
    return obj;
}

为简单起见,我遗漏了try-catch块。

3 个答案:

答案 0 :(得分:19)

而不是JSONObject使用杰克逊的ObjectMapperObjectNode

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(...)valueToTreeconvertValue在POJO之间等等)

请记住,您熟悉的工具可能会使您的思维偏向某些模式,保持开放的思维可以帮助您找到更好的模式。 对于Jackson(或GSON或其他成熟的Java JSON工具),您应该考虑正确的数据绑定可以提供哪些帮助,而不是使用以JSON为中心的树模型(org.json提供)。树模型使您的思维基于JSON结构,这有时是有用的;但也可能会阻止您看到更多自然模式,这些模式来自定义POJO结构以反映预期的JSON,并直接在Java对象上运行。