JAVA Jackson 解析 JSON 包含 List/Array 的响应

JAVA Jackson Parsing JSON Response that Contains List/Array

我正在尝试反序列化 JSON 字符串,但我将 运行 保留为 JSON 映射异常。我一直在网上搜索,但运气不佳。

我尝试反序列化的 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)
    ...

我尝试按照 中所述包装我的回复,但我仍然遇到同样的错误。从调用堆栈跟踪来看,它似乎与 List 有关。即,我需要传递一个列表对象。这 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 时遇到了错字。

您的 JSON 格式不正确。从报错信息可以看出:

[Source: [{"user":{"userId":"fa6491aeb", ..........]; 

解析器似乎遇到了数组而不是对象。

您的代码接缝正确。这是我 运行 并且有效的代码:

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
}

Java

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