public class BadStudentDeserializer extends StdDeserializer<BadStudent>
implements ResolvableDeserializer{
private static final long serialVersionUID = 1L;
private JsonDeserializer<?> defaultDeserializer;
public BadStudentDeserializer(JsonDeserializer<?> defaultDeserializer) {
super(BadStudent.class);
this.defaultDeserializer = defaultDeserializer;
}
@Override
public BadStudent deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode jsonTree = p.getCodec().readTree(p);
String id = jsonTree.get("id").asText();
String weapon = jsonTree.get("weapon").asText();
JsonNode jailNode = jsonTree.get("jail");
JsonParser jailNodeParser = jailNode.traverse();
//advance it as per documentation
jailNodeParser.nextToken();
//this doesnt work
Jail jail = (Jail)defaultDeserializer.
deserialize(jailNodeParser, ctxt);
return new BadStudent(id, weapon, jail);
}
@Override
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
}How do I provide the defaultDeserializer a clue as to what class TYPE a tree node is, so that it can pick up the right deserializer or that treeNode?
Hope I am able to explain myself clearly.
JsonNode jailNode = jsonTree.get("jail");
JsonParser jailNodeParser = jailNode.traverse();
Jail jail = ctxt.readValue(jailNodeParser, Jail.class);
Is that what you meant?
JsonNode eventNode = jsonTree.get("event");
ctxt
.findNonContextualValueDeserializer(ctxt.constructType(Event.class))
.deserialize(eventNode.traverse(parser.getCodec()));
@Override
public void serialize(EventMessage value, JsonGenerator gen,
SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeObjectField("event", value.getPayLoad());
gen.writeObjectField("headers", value.getHeaders());
gen.writeEndObject();
}
@Override
public void serialize(EventMessage value, JsonGenerator gen,
SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeObjectField("event", value.getPayLoad());
gen.writeObjectField("headers", value.getHeaders());
gen.writeEndObject();
}