Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 无法在Jackson中使用JsonParser反序列化_Java_Json_Jetty_Jackson_Deserialization - Fatal编程技术网

Java 无法在Jackson中使用JsonParser反序列化

Java 无法在Jackson中使用JsonParser反序列化,java,json,jetty,jackson,deserialization,Java,Json,Jetty,Jackson,Deserialization,我试图使用org.codehaus.jackson.map.deser.std.StdDeserializer执行自定义反序列化 我的主要目标是能够连接到Jetty的JSON处理结构,并使用Jackson而不是默认的JettyJSON 所以现在,我正在测试这是否有效 我有一个测试,它试图读取一个简单的JSON字符串并将其转换为一个Presence对象 public void testBasicJson() throws JsonParseException, JsonMappin

我试图使用
org.codehaus.jackson.map.deser.std.StdDeserializer
执行自定义反序列化

我的主要目标是能够连接到Jetty的JSON处理结构,并使用Jackson而不是默认的JettyJSON

所以现在,我正在测试这是否有效

我有一个测试,它试图读取一个简单的JSON字符串并将其转换为一个Presence对象

public void testBasicJson() throws JsonParseException,
        JsonMappingException,
        IOException {
    ObjectMapper mapper = new ObjectMapper();
    JsonObjectDeserializer jod = new JsonObjectDeserializer();
    SimpleModule module = new SimpleModule("JsonObjectDeserializer",
        new Version(1, 0, 0, null));
    module.addDeserializer(JsonObject.class, jod);
    mapper.registerModule(module);

    //formatted for easy reading
    String jsonSimple = "{
        \"userEmail\":\"user1@lab.com\",
        \"type\":\"presence\",
        \"domain\":\"lab.com\"
    }";
    JsonObject pres = mapper.readValue(jsonSimple, JsonObject.class);
    System.out.println(pres.toString());
}
出席课程为:

public class Presence extends JsonObject {
    private static final long serialVersionUID    = 1L;
    protected String userEmail;
    protected String domain;
    protected String type;

    public Presence() {
    }

    //necessary GETTERs and SETTERs are created for userEmail, domain and type

    public String toString() {
        StringBuffer sb = new StringBuffer("\tuser: ");
        sb.append(userEmail);
        sb.append(" - ");
        sb.append(domain);
        return sb.toString();
    }
}
import org.cometd.server.ServerMessageImpl;

public abstract class JsonObject extends ServerMessageImpl {
    private static final long   serialVersionUID    = 1L;
}
父类是:

public class Presence extends JsonObject {
    private static final long serialVersionUID    = 1L;
    protected String userEmail;
    protected String domain;
    protected String type;

    public Presence() {
    }

    //necessary GETTERs and SETTERs are created for userEmail, domain and type

    public String toString() {
        StringBuffer sb = new StringBuffer("\tuser: ");
        sb.append(userEmail);
        sb.append(" - ");
        sb.append(domain);
        return sb.toString();
    }
}
import org.cometd.server.ServerMessageImpl;

public abstract class JsonObject extends ServerMessageImpl {
    private static final long   serialVersionUID    = 1L;
}
自定义反序列化程序是:

import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.deser.std.StdDeserializer;

public class JsonObjectDeserializer extends StdDeserializer<JsonObject> {
    public JsonObjectDeserializer() {
        super(JsonObject.class);
    }

    @Override
    public JsonObject deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        //so I'm at a loss at this point
        //if (jp.nextToken() != JsonToken.START_OBJECT) {
        //    throw new IOException("Invalid");
        //}
    }
}
import org.codehaus.jackson.JsonParser;
导入org.codehaus.jackson.JsonProcessingException;
导入org.codehaus.jackson.JsonToken;
导入org.codehaus.jackson.map.DeserializationContext;
导入org.codehaus.jackson.map.desr.std.StdDeserializer;
公共类JsonObjectDeserializer扩展StdDeserializer{
公共JsonObjectDeserializer(){
super(JsonObject.class);
}
@凌驾
公共JsonObject反序列化(JsonParser jp,反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
//所以我现在不知所措
//if(jp.nextToken()!=JsonToken.START\u对象){
//抛出新IOException(“无效”);
//}
}
}
我面临的问题是反序列化程序的部分。尝试使用JsonParser读取令牌不起作用,因为它总是返回null

我坚信我非常接近解决方案,在反序列化程序中只遗漏了一件事。我只是需要一些指导来达到最终目标


感谢您的帮助

好吧,经过几天的探索和几个小时的提问,我已经找到了自己问题的答案

这是一个正确推进JsonParser的问题

方法的内容应为:

public JsonObject deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
    if (jp.getCurrentToken() != JsonToken.START_OBJECT) {
        throw new IOException("invalid start marker");
    }
    Presence p = new Presence();
    while (jp.nextToken() != JsonToken.END_OBJECT) {
        String fieldname = jp.getCurrentName();
        jp.nextToken();  //move to next token in string
        if ("userEmail".equals(fieldname)) {
            p.setUserEmail(jp.getText());
        } else if ("domain".equals(fieldname)) {
            p.setDomain(jp.getText());
        } else if ("type".equals(fieldname)) {
            p.setType(jp.getText());
        }
    }
    jp.close();
    return p;
}

需要更清楚地阅读Jackson的Javadocs和Javadocs,才能确定正确的方法。

很高兴你能找到答案!但有一个问题——类看起来像POJO,
ObjectMapper.readValue(…)
应该能够立即读取它。所以我很好奇为什么需要自定义反序列化程序?或者只是为了学习如何去做,在需要的情况下?(我确信它是存在的)@StaxMan是的,你是对的,
readValue()
方法应该立即工作。我需要它做的是能够根据JSON字符串中是否存在某些字段返回不同的类对象(不同的父级)。这是我试图在Jetty中重写默认的JSON读取行为。我现在意识到这不是正确的做法。但至少我对杰克逊有了更多的了解!:)