Jackson JSON Object mapper: как отобразить массив?
Я пытаюсь сопоставить массив из вызова backend api. Как я могу сопоставить эти данные, зная, что:
Для хранения данных массива json будут использоваться следующие классы:
@Data
private static class UserListBean {
private List<UserBean> userList;
}
@Data
private static class UserBean {
private String id;
private String userName;
private String password;
}
Json будет иметь следующий формат (в следующем примере только один элемент):
[
{
"id":1,
"userName":"bob",
"password":"403437d5c3f70b1329f37a9ecce02adbbf3e986"
}
]
Я использую Jackson, и до сих пор я пробовал следующее, Но он продолжает посылать мне исключение
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final ObjectReader reader = mapper.reader(UserListBean.class);
GeoHubAccountListBean accounts = null;
try {
accounts = reader.readValue(jsonString);
} catch (final IOException ex) {
log.error("Cannot convert JSON into a list of users", ex);
}
Здесь конечный читатель ObjectReader = картограф.читатель (UserListBean.класс); выдает исключение
Can not deserialize instance of com.xxx.XXX$UserListBean out of START_ARRAY token
Есть идеи ?
Спасибо
2 ответа:
Ну, если вы пытаетесь десериализовать json в объект типа
Таким образом, ваша внешняя конструкция most json должна быть объектом. Ваша внешняя самая json конструкция - это JSONArray.UserListBean
, то вам нужно десериализовать JSONObject (объекты Java, как правило, сопоставляются с JSONObjects).Ваш
UserListBean
имеет одно поле, которое являетсяList<UserBean>
. Таким образом, ваша конструкция JSON верхнего уровня (которая является JSONObject) должна содержать одно поле с именем 'userList' со значением, которое является JSONArray (Коллекции Java, как правило, сопоставляются с JSONArrays).Я думаю, что это тот самый json, который вы ищете:
{ "userList":[ { "id":1, "userName":"bob", "password":"403437d5c3f70b1329f37a9ecce02adbbf3e986" } ] }
Если у вас нет контроля над JSON, то вы, вероятно, хотите избавиться от родительского объекта
UserListBean
и иметь дело непосредственно сList<UserBean>
, так как это будет работать с JSON, который вы предоставили.
Попробуйте что-нибудь вроде следующего:
public static <T> T mapFromJson(String json, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); return objectMapper.readValue(json, clazz); } public static void main(String[] args) throws IOException { HeaVO HeaVO=new HearVO(); HeaVO.setId("Id"); List<HeaVO> listVO=new ArrayList<HeaVO>(); listVO.add(HeaVO); List<HeaVO> listHeaVORes=Arrays.asList(mapFromJson(mapToJson(listHeaVO), HeaVO[].class)); System.out.println(((HeaVO)listVORes.get(0)).getId()); }