Сериализация преобразованных карт в списки вместо использования пользовательского KeySerializer - PullRequest
0 голосов
/ 17 мая 2019

При использовании пользовательских StdConverter s для сопоставления от Map<Object, Object> до Set<Map.Entry<Object, Object>> и наоборот, Джексон все еще пытается найти десериализатор ключа карты:

Исключение в потоке "main"com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно найти десериализатор ключа (Map) для типа [простой тип, класс Test $ Person]

Это POJO, который я использую (только длядемонстрационные цели c):

public class Test {
    private static class Person {
        @JsonProperty
        String name;

        @JsonProperty
        String sex;

        public Person(final String name, final String sex) {
            this.name = name;
            this.sex = sex;
        }
    }

    @JsonProperty
    Map<Person, Integer> map = Map.of(new Person("male", "m"), 42, new Person("female", "f"), 43);
}

Это остальная часть программы, включая конвертеры:

public class Test {
    public static final class Serialize extends StdConverter<Map<Object, Object>, Set<Map<String, Object>>> {
        @Override
        public Set<Map<String, Object>> convert(final Map<Object, Object> value) {
            return value.entrySet().stream().map(e -> Map.of("key", e.getKey(), "value", e.getValue())).collect(toSet());
        }
    }

    public static final class Deserialize extends StdConverter<Set<Map<String, Object>>, Map<Object, Object>> {
        @Override
        public Map<Object, Object> convert(final Set<Map<String, Object>> value) {
            final Map<Object, Object> result = new LinkedHashMap<>();
            for (final Map<String, Object> entry : value) {
                result.put(entry.get("key"), entry.get("value"));
            }

            return result;
        }
    }

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    static {
        OBJECT_MAPPER.setConfig(OBJECT_MAPPER.getSerializationConfig().withInsertedAnnotationIntrospector(new NopAnnotationIntrospector() {
            @Override
            public Object findSerializationConverter(final Annotated a) {
                if (a.getRawType() == Map.class) {
                    return new Serialize();
                }
                return super.findSerializationConverter(a);
            }

            @Override
            public Object findDeserializationConverter(final Annotated a) {
                if (a.getRawType() == Map.class) {
                    return new Deserialize();
                }
                return super.findDeserializationConverter(a);
            }
        }));
    }

    public static void main(final String[] args) throws IOException {
        final Test test = new Test();
        final String json = OBJECT_MAPPER.writeValueAsString(test);
        System.err.println(json);
        System.err.println(OBJECT_MAPPER.readValue(json, Test.class));
    }
}

Почему я все еще получаю

Исключениев потоке "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно найти десериализатор ключа (Map) для типа [простой тип, класс Test $ Person]

Вывод JSON - это то, чтоЯ ожидаю:

{"map":[{"key":{"name":"female","sex":"f"},"value":43},{"key":{"name":"male","sex":"m"},"value":42}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...