Я получаю результаты от REST API, это список объектов json, представляющих пользователей с вложенными объектами json внутри каждого пользователя.Моя проблема в том, что имена вложенных свойств не соответствуют свойствам бина, которые я получил в своем коде.Но они настолько неуместны, что я действительно не хочу оставлять имена вложенных свойств API ...
Я использую genson 1.5 с java 8 и lombok для своих bean-компонентов.Я попытался использовать простой десериализатор, а затем конвертер, но безуспешно.
Вот пример того, что я получаю от API:
[
{
"FirstName": "Jack",
"LastName": "Sparrow",
"Adress": {
"String1": "Toulon",
"String2": "France",
"String3": "83",
}
},
{
"FirstName": "I am",
"LastName": "Groot",
"Adress": {
"String1": "Marseille",
"String2": "France",
"String3": "13",
}
},
]
Вот бин, который я хочу получить какновый формат:
@Data
public class User {
private String firstName;
private String lastName;
private String country; //this represents String2 from the API
}
Я уже пробовал эти решения:
- Просто с помощью рекомендованной десериализации (ошибка, потому что не получается получить те же свойства из API по сравнению с моим bean-компонентом):
private Genson genson = new Genson();
public List<User> getUserList() {
Response response = api.target(url)...get();
List<User> users = genson.deserialize(response.readEntity(String.class), new GenericType<List<User>>(){});
return users;
}
- Использование преобразователя для получения тех же параметров, что и у моего компонента
private Genson genson = new GensonBuilder().withConverters(new UserConverter()).create();
public List<User> getUserList() {
Response response = api.target(url)...get();
List<User> users = this.genson.deserialize(response.readEntity(String.class), new genericType<List<User>>(){});
return users;
}
public class UserConverter implements Converter<User> {
public User deserialize(ObjectReader reader, Context ctx) throws Exception {
User user = new User();
reader.beginObject();
while (reader.hasNext()) {
reader.next();
if ("FirstName".equals(reader.name())) {
user.setFirstName(reader.valueAsString());
} else if ("LastName".equals(reader.name())) {
user.setLastName(reader.valueAsString());
} else if ("Adress".equals(reader.name())) {
reader.beginObject();
while (reader.hasNext()) {
if ("String2".equals(reader.name())) {
user.setCountry(reader.valueAsString());
} else {
reader.skipValue();
}
}
reader.endObject();
} else {
reader.skipValue();
}
}
reader.endObject();
return user;
}
@Override
public void serialize(User object, ObjectWriter writer, Context ctx) throws Exception {
// TODO Auto-generated method stub
}
}
Ошибка:
com.owlike.genson.JsonBindingException: Could not deserialize to type interface java.util.List
at com.owlike.genson.Genson.deserialize(Genson.java:384)
...
Caused by: com.owlike.genson.stream.JsonStreamException: Illegal character at row 0 and column 660 expected } but read '{' !
at com.owlike.genson.stream.JsonReader.newWrongTokenException(JsonReader.java:942)
...
Генсон приводит пример на http://genson.io/Documentation/UserGuide/#custom-serde, но они читают список целых чисел как значение, поэтому я попробовал вложенное время для вложенного json ...
Если у кого-то есть идеио том, как справиться с моей проблемой, большое спасибо!