Jackson Json对象映射器:如何映射数组?

时间:2013-07-25 17:06:29

标签: json spring rest jackson datamapper

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

有什么想法吗?

感谢

2 个答案:

答案 0 :(得分:3)

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

因此,您最外层的json构造应该是一个对象。你最外面的json构造是一个JSONArray。

您的UserListBean有一个字段,即List<UserBean>。所以你的顶级json构造(它是一个JSONObject)应该包含一个名为'userList'的字段,其值为JSONArray(Java Collections倾向于映射到JSONArrays)。

我认为这是你正在寻找的实际的json:

{
  "userList":[
     {
       "id":1,
       "userName":"bob",
       "password":"403437d5c3f70b1329f37a9ecce02adbbf3e986"
     }
  ]
}

如果你无法控制进入的json,那么你可能想要抛弃父对象UserListBean并直接处理List<UserBean>,因为这可以与你提供的json一起使用。

答案 1 :(得分: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());
}