Джексон: десериализовать все виды несуществующих списков в пустые списки.JAVA

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

Сообщение Anonymous »

Учитывается следующий SampleTestClass, в котором я пытаюсь преобразовать JSON в Java:
class EmptyListDeserializerTest {

final ObjectMapper objectMapper = new ObjectMapper();

{
objectMapper.configOverride(List.class)
.setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY, Nulls.AS_EMPTY));
}

@Test
void test2() throws JsonProcessingException {
final var result = objectMapper.readValue("null", new TypeReference() {});

assertThat(result).isEmpty();
}

@Test
void test3() throws JsonProcessingException {
final var json = """
[{
"name": "John Doe",
"address": null
}]
""";
final var result = objectMapper.readValue(json, new TypeReference() {});

assertThat(result.get(0).address).isEmpty();
}

@Test
void test4() throws JsonProcessingException {
final var json = """
[{
"name": "John Doe"
}]
""";
final var result = objectMapper.readValue(json, new TypeReference() {});

assertThat(result.get(0).address).isEmpty();
}

public static class MyClass {

public MyClass() {
}

private String name;

public MyClass(final String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(final String name) {
this.name = name;
}
}

public static class MyComplexClass {

public MyComplexClass() {
}

private String name;
private List address;

public MyComplexClass(final String name, final List address) {
this.name = name;
this.address = address;
}

public String getName() {
return name;
}

public void setName(final String name) {
this.name = name;
}

public List getAddress() {
return address;
}

public void setAddress(final List address) {
this.address = address;
}
}

}
Я хочу сопоставить все виды несуществующих списков с пустыми списками.
Адаптация самих сущностей не является задачей решение.
Только ObjectMapper можно адаптировать.
Я испробовал все возможные решения, но мне удалось пройти только test3, все остальные не сработали.Я также попробовал CustomerDeserializer, но он так и не был вызван, хотя и был зарегистрирован:
public List deserialize(JsonParser p, DeserializationContext ctxt)

Итак, чего мне не хватает?
--- РЕДАКТИРОВАТЬ ---
Вместо этого используйте эту конфигурацию:
{
objectMapper.configOverride(List.class)
.setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY, Nulls.AS_EMPTY));
SimpleModule module = new SimpleModule();
module.addDeserializer(List.class, new EmptyListDeserializer());
this.objectMapper.registerModule(module);
}

и немного изменив test2 (добавив экранированные двойные кавычки):
@Test
void test2() throws JsonProcessingException {
final var result = objectMapper.readValue("\"null\"", new TypeReference() {});

assertThat(result).isEmpty();
}

тест 2 пройден, но тест 3 не пройден.
Пользовательский десериализатор выглядит следующим образом:
public class EmptyListDeserializer extends JsonDeserializer deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
// Check for null or 'null' string value
if (p.getCurrentToken() == JsonToken.VALUE_NULL
|| p.getCurrentToken().isScalarValue()
|| (p.getCurrentToken() == JsonToken.VALUE_STRING && "null".equals(p.getText()))) {
return Collections.emptyList();
}
// Otherwise, proceed with default deserialization
return p.readValueAs(List.class);
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... mpty-lists
Ответить

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

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

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

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

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