我试图反序列化JSON字符串,但我一直在遇到JSON Mapping Exception。我一直在网上搜索,但运气不好。
我尝试反序列化的JSON响应如下所示:
{
"comments": [{
"id": "fa6491aeb",
"user": {
"userId": "e4dddf5e1",
"username": "UserX",
"name": "UserX",
"profilePhotoUri": ""
},
"message": "8: 23 - UserX",
"timestamp": 1429844781919
},{
"id": "ed3e71",
"user": {
"userId": "20b8f1",
"username": "UserW",
"name": "UserW",
"profilePhotoUri": ""
},
"message": "8: 22 - UserW",
"timestamp": 1429844780250
},
//... more items
],
"canCallerComment": true
}
这是我得到的错误的删节版本:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.test.android.CommentsResponse out of START_ARRAY token
at [Source: [{"user":{"userId":"fa6491aeb", ..........]; line: 1, column: 1]
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:831)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromArray(BeanDeserializerBase.java:1220)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:165)
...
我尝试按this post中的提法包装我的回复,但我仍然得到同样的错误。从调用堆栈跟踪,似乎它与 List< Comment> 有关。即,我需要传递一个列表对象。这个 objectMapper.readValue(json,CommentResponse.class)还不够吗?
我的JAVA课程定义如下:
public class Comment {
private String id;
private User user;
private String message;
private long timestamp;
// getter/setters
}
public class CommentResponse {
List<Comment> comments;
boolean canCallerComment = false;
// getter/setters
}
如果有帮助,我使用的是Jackson 2.5.3版;目标平台是Android。
修改 下面的Sparks解决方案是正确的。我有一个错字,我试图从错误的Web服务解析JSON。
答案 0 :(得分:3)
您的JSON格式不正确。正如您从错误消息中看到的那样:
[Source: [{"user":{"userId":"fa6491aeb", ..........];
似乎解析器遇到了一个数组而不是一个对象。
答案 1 :(得分:2)
您的代码接缝正确无误。这是我运行和工作的代码:
test.json
{
"comments": [
{
"id": "fa6491aeb",
"user": {
"userId": "e4dddf5e1",
"username": "UserX",
"name": "UserX",
"profilePhotoUri": ""
},
"message": "8: 23 - UserX",
"timestamp": 1429844781919
},
{
"id": "ed3e71",
"user": {
"userId": "20b8f1",
"username": "UserW",
"name": "UserW",
"profilePhotoUri": ""
},
"message": "8: 22 - UserW",
"timestamp": 1429844780250
}],
"canCallerComment": true
}
爪哇
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
CommentResponse commentResponse;
try {
commentResponse = objectMapper.readValue(
new File("P:\\projects\\tests\\json-test\\src\\main\\resources\\test.json"),
CommentResponse.class);
} catch (IOException e) {
e.printStackTrace();
return;
}
commentResponse.getComments();
}
public static class User {
private String userId;
private String username;
private String name;
private String profilePhotoUri;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProfilePhotoUri() {
return profilePhotoUri;
}
public void setProfilePhotoUri(String profilePhotoUri) {
this.profilePhotoUri = profilePhotoUri;
}
}
public static class Comment {
private String id;
private User user;
private String message;
private long timestamp;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}
public static class CommentResponse {
List<Comment> comments;
boolean canCallerComment = false;
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
public boolean isCanCallerComment() {
return canCallerComment;
}
public void setCanCallerComment(boolean canCallerComment) {
this.canCallerComment = canCallerComment;
}
}