У меня ниже ответ json как часть ответа веб-службы, где имя внутреннего объекта - это значение, которое является динамическим. Не могу понять, как объявить эквивалентный java bean ...
{
"error": [
{
"fea09b93175b626e4bb3d248ccb890bc": {
"name": "80_5595_10.zip (5.0)",
"error": [
"Location path does not exist"
]
}
},
{
"5a8745c1967adabe9d492d3595f37ce1": {
"name": "80_7208_01.zip (5.0)",
"error": [
"Location path does not exist"
]
}
}
]




Вы могли бы сделать это таким же образом (пример с использованием Джексона). Я объявил bean следующим образом:
class Error {
String id;
String name;
List<String> error;
// Getters / Setters
@Override
public String toString() {
return "id = "+id+", name = "+name+", error = "+error;
}
}
Ваша структура JSON - Map<String, List<Map<String, Error>>>
// Parse your JSON into a Map<String, List<Map<String, Error>>>
ObjectMapper mapper = new ObjectMapper();
Map<String, List<Map<String, Error>>> map =
mapper.readValue(json, new TypeReference<Map<String, List<Map<String, Error>>>>() {});
Теперь у вас есть эта структура карты
{ error = [
{ fea09b93175b626e4bb3d248ccb890bc = Error@36d64342 },
{ 5a8745c1967adabe9d492d3595f37ce1 = Error@39ba5a14 }
]
}
Затем возьмите каждый ошибочный элемент карты и установите его идентификатор таким же, как и их ключ. И добавляем их в список
List<Map<String, Error>> errorsMap = map.get("error");
List<Error> errors = new ArrayList<>();
for(Map<String, Error> errorMap : errorsMap) {
String key = new ArrayList<>(errorMap.keySet()).get(0);
Error error = errorMap.get(key);
error.setId(key);
errors.add(error);
}
errors.forEach(System.out::println);
Выходы:
id=fea09b93175b626e4bb3d248ccb890bc, name=80_5595_10.zip (5.0), error=[Location path does not exist]
id=5a8745c1967adabe9d492d3595f37ce1, name=80_7208_01.zip (5.0), error=[Location path does not exist]
Возможный дубликат Джексон - Де-сериализация json с динамическим ключом