记一次FastJSON和Jackson解析json时遇到的中括号问题
先列出来正确的解析代码,接着再描写叙述问题详情。
首先是用到的JavaBean
package com.jadyer.model;
public class User {
private String name;
private Book book;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
}
package com.jadyer.model;
public class Book {
private String name;
// private List<Author> author = new ArrayList<Author>();
private Author author;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// public List<Author> getAuthor() {
// return author;
// }
// public void setAuthor(List<Author> author) {
// this.author = author;
// }
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
}
package com.jadyer.model;
public class Author {
private String name;
private int money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
以下是生成json和解析json的代码
package com.jadyer.main;
import java.io.IOException;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import com.alibaba.fastjson.JSON;
import com.jadyer.model.User;
public class JSONDemo {
// /**
// * 生成{"book":{"author":[{"money":500,"name":"南派三叔"},{"money":200,"name":"孔二狗"}],"name":"网络文学"},"name":"玄玉"}
// */
// private static String format(){
// List<Author> authorList = new ArrayList<Author>();
// Author author11 = new Author();
// author11.setName("南派三叔");
// author11.setMoney(500);
// authorList.add(author11);
// Author author22 = new Author();
// author22.setName("孔二狗");
// author22.setMoney(200);
// authorList.add(author22);
// Book book = new Book();
// book.setName("网络文学");
// book.setAuthor(authorList);
// User user = new User();
// user.setName("玄玉");
// user.setBook(book);
// return JSON.toJSONString(user);
// }
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
String jsonText = "{\"book\":{\"author\":{\"money\":500,\"name\":\"南派三叔\"},\"name\":\"网络文学\"},\"name\":\"玄玉\"}";
//用到的jar为fastjson-1.1.36.jar
User userFromFastJSON = JSON.parseObject(jsonText, User.class);
System.out.println(ReflectionToStringBuilder.toString(userFromFastJSON.getBook().getAuthor(), ToStringStyle.MULTI_LINE_STYLE));
System.out.println("----------------------------------------------------------------------------------");
//用到的jar为jackson-all-1.9.11.jar
User userFromJackson = new ObjectMapper().readValue(jsonText, User.class);
System.out.println(ReflectionToStringBuilder.toString(userFromJackson.getBook().getAuthor(), ToStringStyle.MULTI_LINE_STYLE));
}
}
接下来描写叙述下遇到的问题
//上面解析正常时用到的json串
//"{\"book\":{\"author\":{\"money\":500,\"name\":\"南派三叔\"},\"name\":\"网络文学\"},\"name\":\"玄玉\"}";
//我在用fastjson和jackson解析时都会报错时用的json串
//"{\"book\":{\"author\":[{\"money\":500,\"name\":\"南派三叔\"}],\"name\":\"网络文学\"},\"name\":\"玄玉\"}";
//它俩的差别在于:book中仅仅有一个author对象,仅仅是多加了[],但其仍为合法的json串
//而且http://tool.oschina.net/codeformat/json均验证通过
但在解析时。FastJSON会报以下的异常
Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, expect {, actual ], pos 39
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:212)
at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseRest(ASMJavaBeanDeserializer.java:96)
at Fastjson_ASM_User_1.deserialze(Unknown Source)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:513)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:220)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:179)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:323)
at com.jadyer.main.JSONDemoDetail.main(JSONDemoDetail.java:18)
Jackson会报以下的异常
Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.jadyer.model.Author out of START_ARRAY token
at [Source: java.io.StringReader@509ced8e; line: 1, column: 10] (through reference chain: com.jadyer.model.User["book"]->com.jadyer.model.Book["author"])
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219)
at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromArray(BeanDeserializer.java:875)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:597)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)
at com.jadyer.main.JSONDemoDetail.main(JSONDemoDetail.java:22)
个人感觉Jackson的异常看上去更直观,可能是二者内部的验证逻辑不同导致的
只是还是倾向于FastJSON,即便一时之间没看明确它的异常描写叙述。但那也仅仅是这方面的经验不足而已
以下说一下解决的方法:Book.java中将author改动为List<Author>类型的属性。并加入相应的setter和getter就可以
个人的理解是:FastJSON和Jackson解析json为JavaBean时,先查看实体类的相应属性
当发现该属性不能承载多个对象值,且json串中恰好该属性使用的是中括号。这并非它预期的大括号,于是报错了
记一次FastJSON和Jackson解析json时遇到的中括号问题的更多相关文章
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- fastjson生成和解析json数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- JackSon解析json字符串
JackSon解析json字符串 原文:http://blog.csdn.net/java_huashan/article/details/9353903 概述 jackson解析json例子 准备工 ...
- java分享第十三天(fastjson生成和解析json数据,序列化和反序列化数据)
fastjson简介:Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack ...
- 使用 jackson 解析 json 演示样例
首先须要下载3个包,下载地址在Github FasterXML,这三个核心模块各自是: Streaming ("jackson-core") defines low-level s ...
- Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties
转自:http://blog.csdn.net/ngl272/article/details/70217104 以前解析json用的惯的就是Google的gson了,用惯了基本就用它了,一直也没发现什 ...
- [转]Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties
以前解析json用的惯的就是Google的gson了,用惯了基本就用它了,一直也没发现什么大问题,因为都是解析简单的json数据.但是最近学习springboot,要解析一个比较复杂的json数据.就 ...
- Jackson 解析 JSON 详细教程
点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. JSON 对于开发者并不陌生,如今的 ...
- 使用jackson序列化json时遇到的坑
公司使用Springboot进行开发,里面默认使用了jackson进行序列化. 但是序列化的过程中一直报错,因此记录一下. ⒈jackson默认大小写敏感,且首字母转小写 在类上添加一下注解即可 @J ...
随机推荐
- java string中indexOf()常用用法
Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String st ...
- AC日记——[ZJOI2009]假期的宿舍 cogs 1333
1333. [ZJOI2009] 假期的宿舍 ★★☆ 输入文件:zjoi09holiday.in 输出文件:zjoi09holiday.out 简单对比时间限制:1 s 内存限制:25 ...
- Echarts-之显示百分比
对于使用echarts要显示百分比,要改两个地方,第一个地方时坐标轴显示为百分比的格式,第二个是让值以百分比的形式显示,如50,在图上面显示为50%. yAxis: [ { type: 'value' ...
- FileChannel指南
推荐关注公众号:锅外的大佬 每日推送国外技术好文,帮助每位开发者更优秀地成长 原文链接:https://www.baeldung.com/java-filechannel 作者:baeldung 译者 ...
- Java原子类及内部原理
一.引入 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作是原子操作.再比如:a++: 这个操作实际是a = a + ...
- echarts判断点击参数类型,series为有效,markPoint 无效
https://www.w3cschool.cn/echarts_tutorial/echarts_tutorial-7o3u28yh.html 可以设置如果点击的是markPoint,直接返回
- webpack 学习笔记 03 Code Splitting
Introduction 对于较大的web 应用来说,将所有的代码文件压缩成一个文件是不合适的,在部分代码文件只有特殊情况下才被需要的情况下,这无疑是一种浪费.webpack 提供了讲代码文件分块的能 ...
- iOS开发 ----- 加载动画之牛顿摆的实现
牛顿摆动画 自己看动画有一段时间了,但是还是不是很能理解其中的一些属性方法之类的东西,琢磨了一下午写了一个牛顿摆的动画,这里记录一下,一遍以后查看先上图 先说下思路 说下牛顿摆的大致运动过程 根据牛顿 ...
- 怎样用命令行管理SharePoint Feature?
普通情况下对IT管理者来说.在SharePoint Farm中维护Feature,更喜欢使用命令行实现,这样能够省去登录到详细网站的操作. 比方IT接到end user的一个需求,要开启Site Co ...
- vue2.0 + vux (四)Home页
1.综合页(首页) Home.vue <!-- 首页 --> <template> <div> <!-- 顶部 标题栏 --> <app-head ...