记一次FastJSON和Jackson解析json时遇到的中括号问题
2014-04-24 10:29
856 查看
先列出来正确的解析代码,接着再描述问题详情。
首先是用到的JavaBean
下面是生成json和解析json的代码
接下来描述下遇到的问题
但在解析时,FastJSON会报下面的异常
Jackson会报下面的异常
个人感觉Jackson的异常看上去更直观,可能是二者内部的验证逻辑不同导致的
不过还是倾向于FastJSON,即便一时之间没看明白它的异常描述,但那也只是这方面的经验不足而已
下面说一下解决办法:Book.java中将author修改为List<Author>类型的属性,并添加对应的setter和getter即可
个人的理解是:FastJSON和Jackson解析json为JavaBean时,先查看实体类的对应属性
当发现该属性不能承载多个对象值,且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串中恰好该属性使用的是中括号,这并不是它预期的大括号,于是报错了
相关文章推荐
- Android请求网络数据,json解析-FastJson遇到的问题 首字母大写问题
- 解决fastjson、Jackson、Gson解析Json数据时,key为Java中关键字无法解析的问题
- 使用Gson和FastJson解析JSON数据遇到的问题
- iOS开发中解析JSON中的boolean类型的数据遇到的问题
- 解决android使用gson解析json字符串,并使用混淆编译方式打包apk遇到的问题
- Jason解析基础、 相关类库以及FastJSON、Gson和Jackson
- jackson json开发过程遇到的一些问题小节
- Android的okhttp的post请求,php返回json数据。以及遇到的okhttp dispatcher问题,和json解析遇到的问题
- java ——解析json遇到的问题
- Spring MVC4设置使用fastjson作为json解析器,替代jackson
- C# Json 解析遇到:The token '"' was expected 的 问题处理
- Bug FastJson解析下划线字段问题 _id
- 在解析json时遇到get(key);key不存在时解析错误的问题
- java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析
- SSM框架mybatis-generates遇到的json解析问题
- 遇到bug json解析问题
- Jackson,Gson,Fastjson的解析时间对比
- 用fastjson解析json数据顺序问题,用gson完美解决
- JackSon解析json中文出现的编码问题
- org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '20Spring Jackson 反序列化Date时遇到的问题