Java开发BlueSky客户端:Jackson反序列化Feed JSON失败求助
解决Jackson反序列化BlueSky Feed接口JSON的错误
错误原因
核心问题是JSON结构与POJO类的映射完全不匹配:
- 接口返回的JSON中,
"feed"是一个数组,数组内每个元素是包含post对象的条目 - 你的POJO里,
BlueSkyFeed的feed字段定义为自定义Feed类,而该类又包含post数组,完全搞反了层级结构,导致Jackson无法将数组转成单个Feed对象,抛出MismatchedInputException。
修正后的POJO代码
直接调整结构,让POJO与JSON层级一一对应:
public class BlueSkyFeed { @JsonProperty("feed") // 用List比数组更灵活,也可以换成FeedItem[] private List<FeedItem> feed; public List<FeedItem> getFeed() { return feed; } public void setFeed(List<FeedItem> feed) { this.feed = feed; } // 对应JSON数组里的单个条目,每个条目包含一个post对象 public static class FeedItem { @JsonProperty("post") private Post post; public Post getPost() { return post; } public void setPost(Post post) { this.post = post; } } // 原Post类保持不变,建议替换Date为LocalDateTime更规范 public static class Post { public String uri; public String cid; public Author author; @JsonProperty("record") public Record myrecord; public int replyCount; public int repostCount; public int likeCount; public int quoteCount; // 替换Date为Java8+的LocalDateTime,Jackson默认支持,无需额外配置 public LocalDateTime indexedAt; public Viewer viewer; public ArrayList<Object> labels; public Embed embed; } // 其余Author、Record、Viewer、Embed子类保持原定义即可 }
额外注意事项
- 如果坚持使用
Date类型处理indexedAt,需要给ObjectMapper配置日期格式:ObjectMapper mapper = new ObjectMapper(); // 忽略未知字段,避免接口新增字段导致反序列化失败 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); - 使用
LocalDateTime需要确保项目引入jackson-datatype-jsr310依赖(Maven/Gradle项目),Jackson会自动处理序列化/反序列化。
内容的提问来源于stack exchange,提问作者Gandalf
相关产品推荐
相关产品推荐

