Как рекурсивно проанализировать значение json в ObjectMapper.readValue?

#java #json #jackson

#java #json #джексон

Вопрос:

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

У меня есть таблица SQL, хранящая списки в виде строк json, подобных "[1,2,3]" . И я считываю все столбцы в карту, а затем пытаюсь использовать 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 пытается напрямую преобразовать строку в список и потерпел неудачу. Я ожидал бы, что foo.getBar() вернет список из 3 элементов, но код уже потерпел неудачу на этапе преобразования.

Комментарии:

1. Попробуйте использовать "[{1},{2},{3}]" . И убедитесь, что вы объявили поле в Main , которое является @JsonProperty("bar") List<Integer>;

Ответ №1:

Вы должны сделать "[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]" на то, из чего вы его когда-либо получали.

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

Комментарии:

1. Проблема в том, что я не могу отредактировать карту. Я ищу какую-то аннотацию, которая заставляет objectmapper анализировать строку вместо того, чтобы пытаться привести ее напрямую.