Как я могу сделать общий тип значения для String и Array? - PullRequest
0 голосов
/ 15 марта 2019

Мне нужно проанализировать некоторые данные JSON из удаленного сервиса.

Документы запроса и / или ответа выглядят следующим образом.

{
  "some": "...",
  "someOther": [
    "...",
    "..."
  ],
  "youDontKnow": "...",
  "mayBeThis": [
    "what"
  ]
}

Полагаю, как вы видите, в значениях будут только string или array.

Теперь, вместо сопоставления каждого поля, я хочу знать, есть ли способ работать с последующим сопоставлением.

Map<String, Object> map; // each value may be string or array

Так что я могу получить по ключу и привести значение к String или String[] (или List<String>) по требованию.

Как я могу это сделать?

1 Ответ

1 голос
/ 15 марта 2019

Когда вы используете DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, вы можете рассматривать все значения как List -s.

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);


MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, String.class, List.class);
Map<String, List> map = mapper.readValue(jsonFile, mapType);
System.out.println(map);

печать:

{some=[...], someOther=[..., ...], youDontKnow=[...], mayBeThis=[what]}

Без этого вы можете использовать поведение по умолчанию, которое создает соответствующие типы:

ObjectMapper mapper = new ObjectMapper();

Map<String, Object> map = mapper.readValue(jsonFile, Map.class);
System.out.println(map);

печать:

{some=..., someOther=[..., ...], youDontKnow=..., mayBeThis=[what]}

Второе решение требует от вас проверки, является ли оно List os String. Первое решение позволяет вам рассматривать каждое значение как List, и у вас есть очень краткое решение. Третий вариант - создать POJO с List, String свойствами и Jackson автоматически совпадет и проанализирует данные JSON.

...