JAVA Jackson解析包含列表/数组的JSON响应

时间:2015-04-25 02:25:35

标签: java android json jackson deserialization

我试图反序列化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。

2 个答案:

答案 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;
    }
}