Учитывается следующий 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
Джексон: десериализовать все виды несуществующих списков в пустые списки. ⇐ JAVA
Программисты JAVA общаются здесь
1729525686
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)
Итак, чего мне не хватает?
[b]--- РЕДАКТИРОВАТЬ ---[/b]
Вместо этого используйте эту конфигурацию:
{
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);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79110612/jackson-deserialize-all-kind-of-non-existing-lists-into-empty-lists[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия