Как рекурсивно разобрать значение JSON в ObjectMapper.readValue? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь разобрать строки json внутри строки json в Object с помощью Jackson ObjectMapper. Но я не могу найти чистый способ сделать это.

У меня есть таблица SQL, в которой хранятся списки в виде строк json, например "[1,2,3]". И я считываю все столбцы в Map, затем пытаюсь использовать objectMapper.convertValue для превращения в объект Java.

Итак, вот небольшой фрагмент, чтобы воссоздать проблему. Обратите внимание, я не контролирую, как карта генерируется в реальном коде.

@Data
public class Main {
    private List<Integer> bar;

    public static void main(String[] args) throws Exception{
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> objectMap = new HashMap<String, Object>();
        objectMap.put("bar", "[1,2,3]");
        // Main foo = objectMapper.convertValue(objectMap, Main.class)
        String json = objectMapper.writeValueAsString(objectMap);
        Main foo = objectMapper.readValue(json, Main.class);

        System.out.println(foo.getBar());
    }
}

Но это не правильно. Вместо того, чтобы анализировать строку, ObjectMapper пытается преобразовать String в List напрямую и не удалось. Я ожидаю, что foo.getBar () вернет список с 3 элементами, но код уже потерпел неудачу на этапе преобразования.

1 Ответ

0 голосов
/ 02 апреля 2019

Вы должны сделать "[1,2,3]" как String[] так:

"[1,2,3]".replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\s", "").split(",")

Что-то вроде:

public static void main(String[] args) throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> objectMap = new HashMap<String, Object>(){{
        put("bar", "[1,2,3]".replaceAll("\\[", "")
                            .replaceAll("]", "")
                            .replaceAll("\\s", "").split(","));
    }};

    String json = objectMapper.writeValueAsString(objectMap);
    Main foo = objectMapper.readValue(json, Main.class);

    System.out.println(foo.getBar());
}

вам просто нужно заменить "[1,2,3]" на то, от чего вы его получили.

Примечание: не уверен насчет логики приложения

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