Интерфейс десериализации Джексона для нескольких типовJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Интерфейс десериализации Джексона для нескольких типов

Сообщение Anonymous »

Я экспериментирую с некоторыми проблемами десериализации Джексона в Java. Я сделал 2 решения и не могу решить проблему. Проблема? Я получил результат с дублированным свойством, полем, которое дублируется после десериализации Джексона. (Моя проблема точно такая же, как и этот вопрос: избегайте дублирования полей, созданных JsonTypeInfo в Джексоне, и никто не сможет дать вам ответ в тот момент)
Во-первых, у меня есть следующее класс:

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

@JsonIgnoreProperties(ignoreUnknown = true)
public class Instance {

@JsonProperty("id")
private String id;

@JsonProperty("name")
private String name;

@JsonProperty("type")
private InstanceType type;
}
Что я пытаюсь сделать, это просто создать экземпляр объекта типа «Экземпляр», сохранить его и прочитать. А в решении 2 объект сохраняется с дублированным типом (тип отображается как массив, содержащий, например, «имя», «первый_тип» или «второй_тип»), в зависимости от того, что я создаю. С помощью решения 1 я могу сохранить объект нормально, но когда я пытаюсь его прочитать, происходит приведение исключений Джексона.
Решение 1:

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

@JsonDeserialize(using = InstanceTypeDeserializer.class)
public interface InstanceType {
String value();
}

@JsonDeserialize(as = HardInstanceType.class)
public enum HardInstanceType implements InstanceType {
FIRST_TYPE("first_type"),
SECOND_TYPE("second_type")
private String value;

HardInstanceType(String value) {
this.value = value;
}

@JsonValue
public String value() {
return value;
}
}

@JsonDeserialize(as = SoftInstanceType.class)
public enum SoftInstanceType implements InstanceType {
//.. types implementaion similar as HardInstanceType
}

public class InstanceTypeDeserializer extends JsonDeserializer {
@Override
public InstanceType deserialize(JsonParser jp,  DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(jp);

if(root.get("name").asText().equals("hard")) {
return mapper.readValue(root.toString(), HardInstanceType.class);
} else {
return mapper.readValue(root.toString(), SoftInstanceType.class);
}
}
}
Проблема этого решения заключается в том, что когда я пытаюсь сохранить данные и сопоставить их с классом, я получаю следующую ошибку:

Разбор исключений json:
com.fasterxml.jackson.databind.JsonMappingException: class
com.fasterxml.jackson.databind.node.TextNode невозможно привести к классу
com.fasterxml.jackson.databind.node.ObjectNode
(com.fasterxml.jackson.databind.node.TextNode и
com.fasterxml.jackson.databind.node.ObjectNode находятся в безымянном модулезагрузчика org.springframework.boot.loader.LaunchedURLClassLoader
@1a3e8e24) (через цепочку ссылок:
java.util.ArrayList[0]->com.project.package.xxxx.Instance["type"])

Решение 2[/b]

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

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "name")
@JsonSubTypes({
@JsonSubTypes.Type(value = HardInstanceType.class, name = "hard") })
public interface InstanceType {
String value();
}
Проблема этого решения заключается в том, что когда я сохраняю данные, когда я создаю объект Instance и сохраняю его в сохраненных данных, я получаю следующее:

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

      "id": "1",
"name": "hard",
"type": [
"hard",
"first_type"
]
что не так, в типе следует хранить только "first_type" (то, что хранится в решении 1, но я не могу это прочитать, ха-ха).
Конечно, класс Instace более сложный и с большим количеством полей, я сокращаю его здесь, просто для примера.
Мне нужна помощь с этим, заранее большое спасибо .

Подробнее здесь: https://stackoverflow.com/questions/681 ... iple-types
Ответить

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

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

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

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

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