Как делегировать десериализацию по умолчанию в пользовательском десериализаторе в Джексоне?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как делегировать десериализацию по умолчанию в пользовательском десериализаторе в Джексоне?

Сообщение Anonymous »

Предположим, я пишу пользовательскую сериализацию для некоторого класса, но хочу обработать одно из его полей методами по умолчанию.

Как это сделать?

При сериализации у нас есть JsonGenerator#writeObjectField().

Но что такое соответствующий метод десериализации?

Обратите внимание на код ниже:

Код: Выделить всё

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;
import java.util.Objects;

public class TryDelegate {

public static class MyOuterClassSerializer extends JsonSerializer {

@Override
public void serialize(MyOuterClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
gen.writeStartObject();

gen.writeObjectField("inner", value.getInner());

gen.writeEndObject();
}
}

public static class MyOuterClassDeserializer extends JsonDeserializer {
@Override
public MyOuterClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

MyOuterClass ans = new MyOuterClass();

JsonToken token;

token = p.getCurrentToken();
if( token != JsonToken.START_OBJECT ) {
throw new JsonParseException("Start object expected", p.getCurrentLocation());
}

if( !"inner".equals(p.nextFieldName() ) ) {
throw new JsonParseException("'inner; field expected", p.getCurrentLocation());
}

MyInnerClass inner = null;// how to desrialize inner from here with default processing???
ans.setInner(inner);

token = p.nextToken();
if( token != JsonToken.END_OBJECT ) {
throw new JsonParseException("End object expected", p.getCurrentLocation());
}

return ans;

}
}

public static class MyInnerClass {
private int value;

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

@Override
public String toString() {
return "{\"value\":" + value + "}";
}
}

@JsonDeserialize(using = MyOuterClassDeserializer.class)
@JsonSerialize(using = MyOuterClassSerializer.class)
public static class MyOuterClass {

private MyInnerClass inner;

public MyInnerClass getInner() {
return inner;
}

public void setInner(MyInnerClass inner) {
this.inner = inner;
}

@Override
public String toString() {
return "{\"inner\":" + Objects.toString(inner) + "}";
}
}

public static void main(String[] args) throws IOException {

ObjectMapper mapper = new ObjectMapper();
String string;

MyInnerClass inner = new MyInnerClass();
inner.setValue(12);

MyOuterClass outer = new MyOuterClass();
outer.setInner(inner);

string = mapper.writeValueAsString(outer);
System.out.println(string);

MyOuterClass outer2 = mapper.readValue(string, MyOuterClass.class);
System.out.println(outer2); // inner was not deserialized

}
}
Как реализовать MyOuterDeserializer?

Подробнее здесь: https://stackoverflow.com/questions/346 ... in-jackson
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»