Дессериализация строки Json для сложного объекта Java

У меня есть такая структура объекта:

class A { List<b> bees;
}
class B { String с;
}
</b>

Я использую парсер Gson, который сериализует такой объект в эту строку:

{"a":{"bees":[{"с":"text"}]}}

(с добавлением корневого элемента "a")

Формат API немного отличается:

{"a":{"bees":[{"b":{"с":"text"}}]}}

Мне нужно иметь возможность правильно разбирать такие строки в объектах A.

По умолчанию объект B (как часть A) становится не пустым, а пустым (все поля равны нулю), что понятно, потому что парсер не находит в нем поля "b" (когда это фактически имя класса).

Я ищу общее решение для этого, у меня много таких сложных объектов, и я не хочу реализовывать множество настраиваемых десериализаторов для каждого из них.

Гсон не обязательно, я могу использовать другой lib, если это необходимо.

Благодарю.

2 ответа

Я предпочитаю Jackson Tree Model и JDK 8 Stream для синтаксического анализа такой строки json, основной идеей является отображение элемента массива bees {"b":{"с":"text"}} на {"с":"text"} по функциональному API map() API.

ObjectMapper mapper = new ObjectMapper();
JsonNode beesNode = mapper.readTree(jsonString).get("a").get("bees");
List<jsonnode> bs = StreamSupport.stream(beesNode.spliterator(), false) .map(bee -> bee.get("b")).collect(Collectors.toList());
</jsonnode>


Если вы можете изменить структуру класса, измените структуру класса так, чтобы он соответствовал формату API. Например,

class A { List<b> bees;
}
class B { MyTypeObjB B;
}
class MyTypeObjB { String c;
}
</b>

EDIT. В соответствии с комментариями вы также можете попробовать настроить метод deserialize, реализуя интерфейс JsonDeserializer в своем пользовательском классе. Вы можете найти подробную информацию о том, как это можно сделать,

licensed under cc by-sa 3.0 with attribution.