打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
记一次FastJSON:com.alibaba.fastjson.JSONException: syntax error, expect {





先列出来正确的解析代码,接着再描述问题详情。


首先是用到的JavaBean

  1. package com.jadyer.model;  
  2.   
  3. public class User {  
  4.     private String name;  
  5.     private Book book;  
  6.       
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public Book getBook() {  
  14.         return book;  
  15.     }  
  16.     public void setBook(Book book) {  
  17.         this.book = book;  
  18.     }  
  19. }  
  1. package com.jadyer.model;  
  2.   
  3. public class Book {  
  4.     private String name;  
  5. //  private List<Author> author = new ArrayList<Author>();  
  6.     private Author author;  
  7.       
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.     public void setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14. //  public List<Author> getAuthor() {  
  15. //      return author;  
  16. //  }  
  17. //  public void setAuthor(List<Author> author) {  
  18. //      this.author = author;  
  19. //  }  
  20.     public Author getAuthor() {  
  21.         return author;  
  22.     }  
  23.     public void setAuthor(Author author) {  
  24.         this.author = author;  
  25.     }  
  26. }  
  1. package com.jadyer.model;  
  2.   
  3. public class Author {  
  4.     private String name;  
  5.     private int money;  
  6.       
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public int getMoney() {  
  14.         return money;  
  15.     }  
  16.     public void setMoney(int money) {  
  17.         this.money = money;  
  18.     }  
  19. }  

下面是生成json和解析json的代码

  1. package com.jadyer.main;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.commons.lang3.builder.ReflectionToStringBuilder;  
  6. import org.apache.commons.lang3.builder.ToStringStyle;  
  7. import org.codehaus.jackson.JsonParseException;  
  8. import org.codehaus.jackson.map.JsonMappingException;  
  9. import org.codehaus.jackson.map.ObjectMapper;  
  10.   
  11. import com.alibaba.fastjson.JSON;  
  12. import com.jadyer.model.User;  
  13.   
  14. public class JSONDemo {  
  15. //  /**  
  16. //   * 生成{"book":{"author":[{"money":500,"name":"南派三叔"},{"money":200,"name":"孔二狗"}],"name":"网络文学"},"name":"玄玉"}  
  17. //   */  
  18. //  private static String format(){  
  19. //      List<Author> authorList = new ArrayList<Author>();  
  20. //      Author author11 = new Author();  
  21. //      author11.setName("南派三叔");  
  22. //      author11.setMoney(500);  
  23. //      authorList.add(author11);  
  24. //      Author author22 = new Author();  
  25. //      author22.setName("孔二狗");  
  26. //      author22.setMoney(200);  
  27. //      authorList.add(author22);  
  28. //      Book book = new Book();  
  29. //      book.setName("网络文学");  
  30. //      book.setAuthor(authorList);  
  31. //      User user = new User();  
  32. //      user.setName("玄玉");  
  33. //      user.setBook(book);  
  34. //      return JSON.toJSONString(user);  
  35. //  }  
  36.       
  37.     public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {  
  38.         String jsonText = "{\"book\":{\"author\":{\"money\":500,\"name\":\"南派三叔\"},\"name\":\"网络文学\"},\"name\":\"玄玉\"}";  
  39.         //用到的jar为fastjson-1.1.36.jar  
  40.         User userFromFastJSON = JSON.parseObject(jsonText, User.class);  
  41.         System.out.println(ReflectionToStringBuilder.toString(userFromFastJSON.getBook().getAuthor(), ToStringStyle.MULTI_LINE_STYLE));  
  42.         System.out.println("----------------------------------------------------------------------------------");  
  43.         //用到的jar为jackson-all-1.9.11.jar  
  44.         User userFromJackson = new ObjectMapper().readValue(jsonText, User.class);  
  45.         System.out.println(ReflectionToStringBuilder.toString(userFromJackson.getBook().getAuthor(), ToStringStyle.MULTI_LINE_STYLE));  
  46.     }  
  47. }  

接下来描述下遇到的问题


  1. //上面解析正常时用到的json串  
  2. //"{\"book\":{\"author\":{\"money\":500,\"name\":\"南派三叔\"},\"name\":\"网络文学\"},\"name\":\"玄玉\"}";  
  3. //我在用fastjson和jackson解析时都会报错时用的json串  
  4. //"{\"book\":{\"author\":[{\"money\":500,\"name\":\"南派三叔\"}],\"name\":\"网络文学\"},\"name\":\"玄玉\"}";  
  5. //它俩的区别在于:book中只有一个author对象,只是多加了[],但其仍为合法的json串  
  6. //并且http://tool.oschina.net/codeformat/json均验证通过  

但在解析时,FastJSON会报下面的异常

  1. Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, expect {, actual ], pos 39  
  2.     at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:212)  
  3.     at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseRest(ASMJavaBeanDeserializer.java:96)  
  4.     at Fastjson_ASM_User_1.deserialze(Unknown Source)  
  5.     at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:513)  
  6.     at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)  
  7.     at com.alibaba.fastjson.JSON.parseObject(JSON.java:220)  
  8.     at com.alibaba.fastjson.JSON.parseObject(JSON.java:179)  
  9.     at com.alibaba.fastjson.JSON.parseObject(JSON.java:323)  
  10.     at com.jadyer.main.JSONDemoDetail.main(JSONDemoDetail.java:18)  

Jackson会报下面的异常

  1. Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.jadyer.model.Author out of START_ARRAY token  
  2.  at [Source: java.io.StringReader@509ced8e; line: 1, column: 10] (through reference chain: com.jadyer.model.User["book"]->com.jadyer.model.Book["author"])  
  3.     at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)  
  4.     at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219)  
  5.     at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212)  
  6.     at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromArray(BeanDeserializer.java:875)  
  7.     at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:597)  
  8.     at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)  
  9.     at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)  
  10.     at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)  
  11.     at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)  
  12.     at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)  
  13.     at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)  
  14.     at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)  
  15.     at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)  
  16.     at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)  
  17.     at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)  
  18.     at com.jadyer.main.JSONDemoDetail.main(JSONDemoDetail.java:22)  

个人感觉Jackson的异常看上去更直观,可能是二者内部的验证逻辑不同导致的

不过还是倾向于FastJSON,即便一时之间没看明白它的异常描述,但那也只是这方面的经验不足而已

下面说一下解决办法:Book.java中将author修改为List<Author>类型的属性,并添加对应的setter和getter即可

个人的理解是:FastJSON和Jackson解析json为JavaBean时,先查看实体类的对应属性

当发现该属性不能承载多个对象值,且json串中恰好该属性使用的是中括号,这并不是它预期的大括号,于是报错了

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Fastjson介绍
在springmvc中解决FastJson循环引用的问题
com.alibaba.fastjson.JSONObject之对象与JSON转换方法 目录
JAVA 中 Map 与实体类相互转换的简单方法
scala json fastjson json4s
fastjson知多少
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服