我想从org.json
搬到org.codehaus.jackson
。如何转换以下 Java 代码?
private JSONObject myJsonMessage(String message){
JSONObject obj = new JSONObject();
obj.put("message",message);
return obj;
}
为简单起见,我省略了该try-catch
块。
而不是JSONObject
使用杰克逊的ObjectMapper
and ObjectNode
:
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("message", "text");
这将是杰克逊的相当于您当前的org.json
代码。
然而,Jackson 真正擅长的地方在于它能够在 Java 类 (POJO) 和它们的 JSON 表示之间进行复杂的映射,以及它的流 API,它允许你进行非常快速的序列化,至少与org.json
's 的对应物相比。
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,默认情况下映射,你不需要创建一个JSONObject
eg,
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"}
为简洁起见,我跳过了例外情况。
如果你想逐个升级org.json
库Jackson
,并且最初保留相同的 API,你可能需要阅读“从 org.json 升级到 Jackson ”。对于基本的 JSON 读写而言,这至少会使您的代码快 3 倍;另外,如果您愿意的话,您还可以开始转换处理,因为 Jackson 可以轻松地在 Trees 和 POJO(ObjectMapper.treeToValue(...)
、valueToTree
、convertValue
POJO 之间等)之间进行转换。
请记住,您熟悉的工具可能会使您的思维偏向于某些模式,保持开放的心态可以帮助您找到更好的工具。对于 Jackson(或 GSON 或其他成熟的 Java JSON 工具),您确实应该考虑适当的数据绑定可以帮助的地方,而不是使用以 JSON 为中心的树模型(org.json 提供)。树模型让你的思维基于 JSON 结构,这有时很有用;但也可能会阻止您看到更自然的模式,这些模式来自定义 POJO 结构以反映预期的 JSON,并直接在 Java 对象上操作。