日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看


    
歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

记一次FastJSON和Jackson解析json时遇到的中括号问题

發(fā)布時(shí)間:2025/5/22 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记一次FastJSON和Jackson解析json时遇到的中括号问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主同意不得轉(zhuǎn)載。 https://blog.csdn.net/jadyer/article/details/24395015

完整版見https://jadyer.github.io/




先列出來正確的解析代碼,接著再描寫敘述問題詳情。


首先是用到的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":"網(wǎng)絡(luò)文學(xué)"},"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("網(wǎng)絡(luò)文學(xué)"); // 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\":\"網(wǎng)絡(luò)文學(xué)\"},\"name\":\"玄玉\"}";//用到的jar為fastjson-1.1.36.jarUser 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.jarUser userFromJackson = new ObjectMapper().readValue(jsonText, User.class);System.out.println(ReflectionToStringBuilder.toString(userFromJackson.getBook().getAuthor(), ToStringStyle.MULTI_LINE_STYLE));} }
接下來描寫敘述下遇到的問題


//上面解析正常時(shí)用到的json串 //"{\"book\":{\"author\":{\"money\":500,\"name\":\"南派三叔\"},\"name\":\"網(wǎng)絡(luò)文學(xué)\"},\"name\":\"玄玉\"}"; //我在用fastjson和jackson解析時(shí)都會(huì)報(bào)錯(cuò)時(shí)用的json串 //"{\"book\":{\"author\":[{\"money\":500,\"name\":\"南派三叔\"}],\"name\":\"網(wǎng)絡(luò)文學(xué)\"},\"name\":\"玄玉\"}"; //它倆的差別在于:book中僅僅有一個(gè)author對(duì)象,僅僅是多加了[],但其仍為合法的json串 //而且http://tool.oschina.net/codeformat/json均驗(yàn)證通過
但在解析時(shí)。FastJSON會(huì)報(bào)以下的異常

Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, expect {, actual ], pos 39at 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會(huì)報(bào)以下的異常

Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.jadyer.model.Author out of START_ARRAY tokenat [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)
個(gè)人感覺Jackson的異常看上去更直觀,可能是二者內(nèi)部的驗(yàn)證邏輯不同導(dǎo)致的

只是還是傾向于FastJSON,即便一時(shí)之間沒看明確它的異常描寫敘述。但那也僅僅是這方面的經(jīng)驗(yàn)不足而已

以下說一下解決的方法:Book.java中將author改動(dòng)為L(zhǎng)ist<Author>類型的屬性。并加入相應(yīng)的setter和getter就可以

個(gè)人的理解是:FastJSON和Jackson解析json為JavaBean時(shí),先查看實(shí)體類的相應(yīng)屬性

當(dāng)發(fā)現(xiàn)該屬性不能承載多個(gè)對(duì)象值,且json串中恰好該屬性使用的是中括號(hào)。這并非它預(yù)期的大括號(hào),于是報(bào)錯(cuò)了

轉(zhuǎn)載于:https://www.cnblogs.com/ldxsuanfa/p/10034445.html

總結(jié)

以上是生活随笔為你收集整理的记一次FastJSON和Jackson解析json时遇到的中括号问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。