3

我正在尝试从后端 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"
   }
]

我正在使用杰克逊,到目前为止我已经尝试了以下方法,但它不断向我发送异常

        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 reader = mapper.reader(UserListBean.class); 抛出异常

Can not deserialize instance of com.xxx.XXX$UserListBean out of START_ARRAY token

任何想法 ?

谢谢

4

2 回答 2

3

好吧,如果您尝试将 json 反序列化为 type 的对象UserListBean,那么您需要反序列化 JSONObject(Java 对象倾向于映射到 JSONObjects)。

因此,您最外层的 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 一起使用。

于 2013-07-25T17:40:52.293 回答
0

尝试以下操作:

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());
}
于 2016-02-15T12:25:03.953 回答