11

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

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

为简单起见,我省略了该try-catch块。

4

3 回答 3

20

而不是JSONObject使用杰克逊的ObjectMapperand ObjectNode

ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("message", "text");

这将是杰克逊的相当于您当前的org.json代码。

然而,Jackson 真正擅长的地方在于它能够在 Java 类 (POJO) 和它们的 JSON 表示之间进行复杂的映射,以及它的流 API,它允许你进行非常快速的序列化,至少与org.json's 的对应物相比。

于 2012-09-21T23:59:56.277 回答
5

Jackson api中没有JSONObject。除了返回 a 之外JSONObject,您还可以返回 Map 或带有 message 属性的 Java Bean,该属性具有 getter 和 setter。

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,默认情况下映射,你不需要创建一个JSONObjecteg,

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"}

为简洁起见,我跳过了例外情况。

于 2012-09-22T00:13:05.877 回答
2

如果你想逐个升级org.jsonJackson,并且最初保留相同的 API,你可能需要阅读“从 org.json 升级到 Jackson ”。对于基本的 JSON 读写而言,这至少会使您的代码快 3 倍;另外,如果您愿意的话,您还可以开始转换处理,因为 Jackson 可以轻松地在 Trees 和 POJO(ObjectMapper.treeToValue(...)valueToTreeconvertValuePOJO 之间等)之间进行转换。

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

于 2012-09-22T17:31:42.523 回答