Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从org.json JSONObject到org.codehaus.jackson_Java_Json_Jackson - Fatal编程技术网

Java 从org.json JSONObject到org.codehaus.jackson

Java 从org.json JSONObject到org.codehaus.jackson,java,json,jackson,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块。而不是JSONObject使用Jackson的ObjectMapper和Objec

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

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

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

而不是
JSONObject
使用Jackson的
ObjectMapper
ObjectNode

ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("message", "text");
这将相当于Jackson当前的
org.json
code


然而,Jackson真正擅长的是在Java类(POJO)和它们的JSON表示之间进行复杂映射的能力,以及它的流API,它允许您进行真正快速的序列化,至少与
org.json
的对应项相比。

Jackson api中没有
JSONObject
。与返回
JSONObject
不同,您可以返回一个映射或带有消息属性的Javabean,该消息属性具有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 Bean,默认情况下映射,您不需要创建
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”}


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

如果您想从
org.json
库逐段升级到
Jackson
库,并且最初保留相同的API,您可能需要阅读“”。 这至少会使您的代码在基本JSON读写方面的速度提高3倍左右;此外,如果您愿意,您还可以开始转换处理,因为Jackson使在树和POJO之间转换变得很容易(
ObjectMapper.treeToValue(…)
valueToTree
convertValue
在POJO之间等)

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

所以
jacksonObj
将是我的返回对象吗?关于jackson的所有炒作,我希望org.codehaus.jackson会比org.JSON更简单。投票支持你的帮助。@kasavbere:我编辑了我的答案,以更好地反映你原来的问题。至于简单性,其实并没有那么简单,但这取决于你想用它做什么。对于更简单的序列化,使用
org.json
更简单。但是,如果您正在进行大型对象序列化,并且有一些自定义需求(例如,将
日期
字段序列化为
字符串
值),那么Jackson是迄今为止最好的选择,imho。我知道我有偏见,但我不认为org.json对于任何用途来说都更简单,只要知道这两种API。有了树模型,它们大致相当。关于jackson的所有宣传,我希望org.codehaus.jackson会比org.json更简单。向上投票支持您的帮助。但是,正如前面所提到的,有两个等价项:
JsonNode
(基本类型)或
ObjectNode
(作为特定的JSON对象子类型)。与org.json不同的是,对于正确的OO访问,存在节点继承。