[英]Unable to Deserialize Using JsonParser in Jackson
我正在尝试使用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;
}
自定义解串器是:
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");
//}
}
}
我面临的问题是解串器中的部分。 尝试使用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;
}
为了更正确地进行操作,对http://www.cowtowncoder.com/blog/archives/2009/01/entry_132.html和Jackson的Javadocs进行了更清晰的阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.