#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 анализировать строку вместо того, чтобы пытаться привести ее напрямую.