我正在尝试从后端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
有什么想法吗?
感谢
答案 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());
}