Конфигурирование парсера json для анализа экранированной строки json в json - PullRequest
0 голосов
/ 22 мая 2019

Предположим, у вас есть следующий фрагмент json

{
    "topic":"foo",
    "payload":"{\"type\":\"String\",\"value\":\"44\"}",
    "type":"ItemStateEvent"
}

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

Теперь к вопросу: как вы настраиваете парсер по вашему выбору, чтобы он выполнял черную работу за вас?

1 Ответ

0 голосов
/ 27 мая 2019

Джексон , библиотека разбора java json, похоже, поддерживает десериализаторы для каждого поля.В результате вы можете добавить @JsonDeserialize(using = NestedDeserializer.class) к определенному «вложенному» полю json.NestedDeserializer является реализацией com.fasterxml.jackson.databind.JsonDeserializer.В настоящее время я работаю со следующей реализацией:

    @Override
    public LinkedHashMap<String, String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectMapper m  = (ObjectMapper) p.getCodec(); // am I sure that codec will always be ObjectMapper?
        TextNode textNode = m.readTree(p);
        LinkedHashMap<String, String> datum = m.readValue(textNode.asText(), LinkedHashMap.class);
        return datum;
    }

Что делает фрагмент, так это десериализует текущий токен в строку и просто запускает его через анализатор во второй раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...