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 3

2 ответа:

Ну, если вы пытаетесь десериализовать json в объект типа UserListBean, то вам нужно десериализовать JSONObject (объекты Java, как правило, сопоставляются с JSONObjects).

Таким образом, ваша внешняя конструкция most json должна быть объектом. Ваша внешняя самая json конструкция - это JSONArray.

Ваш 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());
}