最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

對Java中JSON解析器的一些見解

 更新時(shí)間:2013年12月04日 09:38:52   作者:  
這篇文章主要是對Java中JSON解析器的一些見解。需要的朋友可以過來參考下,希望對大家有所幫助

最近在研究JSON,Java中有很多處理JSON的類庫,lib-json、sf-json、fastjson還有Jackson Json。第一個就不說了,性能和功能都沒有什么亮點(diǎn)。


sf-json最大的優(yōu)點(diǎn)就是隨機(jī)讀取方便。代碼很簡單:

JSONObject json= JSONObject.fromObject(str);

然后讀取字段內(nèi)容:

json.getString或者getInt之類的。但是工作效率有待商榷,而且容易出錯。

另外sf-json還有個優(yōu)點(diǎn)就是自動使用unicode編碼,當(dāng)內(nèi)容中出現(xiàn)中文或者符號的時(shí)候會自動將其轉(zhuǎn)換為\uFFFF這樣的unicode編碼。這樣即便是在web服務(wù)器端的response中沒有設(shè)置編碼,直接推送json也不會出現(xiàn)亂碼問題。


fastjson,顧名思義就是快。網(wǎng)上已經(jīng)有很多性能對比的數(shù)據(jù)了,我就不多說其性能了。

這里要說的就是它的功能性問題。可能是定位不一樣,最初fastjson就是要快,因此在對象的序列化與反序列化上下了很大功夫。但是在功能上有所缺乏。

不知在哪個版本開始加上了key按字典排序的功能。但是貌似這個功能沒有辦法關(guān)閉。有些時(shí)候我是不希望字段順序被打亂的,這個問題就無法解決。

我使用的fastjson版本為1.1.14。另外fastjson還有一些bug沒有解決,而且是比較明顯的bug。例如在@JsonField注解中format參數(shù),這個是用來指定Date類型數(shù)據(jù)如何序列化的。如果你使用英文或符號,OK,沒有問題(例如yyyy-MM-dd),但是格式中一旦出現(xiàn)中文就會出錯(例如yyyy年MM月dd日)。而且經(jīng)過實(shí)驗(yàn),所有的注解都要放在屬性的Getter(就是getXXX()方法)上,直接放在屬性上是無法工作的。在eclipse中,一般我們都是直接寫屬性,屬性寫完后用自動生成的方式生成Getter和Setter方法。如果今后該類的屬性發(fā)生變化了,個人更傾向于直接刪除所有Getter和Setter,然后重新生成。那么假如把注解全放到Getter上面,我刪的時(shí)候就要非常小心。

再有一個比較致命的就是文檔。幾乎找不到全面的文檔來介紹或支持fastjson。整個項(xiàng)目都由一個名為“溫少”的人來負(fù)責(zé),存在很多不確定的因素。


經(jīng)過個人的評估,我更傾向于使用Jackson Json。首先說文檔,Jackson Json官方網(wǎng)站上對每一個版本都有詳盡的文檔(http://jackson.codehaus.org/)。另外Jackson Json的序列化與反序列化速度也并不見得有多慢。更重要的是它的注解支持要好于fastjson。就拿剛才說到的key按字典排序的功能吧,可以在實(shí)體類上直接加上@JsonPropertyOrder(alphabetic=false)注解就可以關(guān)閉排序功能。而對于其他功能的注解支持也很好。

例如Date的序列與反序列化注解支持

@JsonSerialize(using=DateSerializer.class)
@JsonDeserialize(using=DateDeserializer.class)
private Date birthday;

這樣就能指定對birthday字段的序列化與反序列化方法。另外,這兩個注解都直接放在了屬性上,沒有放在Getter上。

針對上面的兩個注解,我的序列化器是這樣寫的

public class DateSerializer extends JsonSerializer<Date>

繼承了JsonSerializer,泛型中指定了序列化類型為Date,然后重寫如下方法

@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException

方法中傳進(jìn)來的date就是將要被序列化的數(shù)據(jù),接下來你可以任意展示該數(shù)據(jù),在退出該方法之前使用gen.writeString(formattedDate);來完成序列化就可以了。

類似地,我的反序列化器是這樣寫的:

public class DateDeserializer extends JsonDeserializer<Date>

繼承了JsonDeserializer,泛型中指定了反序列化類型為Date,然后重寫如下方法

@Override
public Date deserialize(JsonParser parser, DeserializationContext context)throws IOException, JsonProcessingException {

這里面方法的返回值就是反序列化后的最終內(nèi)容。方法內(nèi)部你可以使用parser.getText()來獲取到當(dāng)前要處理的內(nèi)容。你可以隨便折騰里面的數(shù)據(jù),只需要最后返回你想要的Date就可以了。


另外在制作基于Jackson Json的Service時(shí)想使用泛型的思想來寫一個接口,最終目的就是希望方法能隨著參數(shù)類型不同,返回值的類型也隨之不同。以前很少寫泛型的方法,這個問題雖然基礎(chǔ),但是難住了我,經(jīng)過查看Jackson Json的源代碼,我得到了啟示,像下面這樣寫就OK了:

public <T> T strToObj(String jsonStr, Class<T> clazz)


這樣寫就可以了。假設(shè)我有一個Result類型的對象需要反序列化,當(dāng)前已經(jīng)有了一個json字符串jsonStr,那么我只需要指定第二個參數(shù)clazz就可以直接得到Result類型的對象了:

Result newResult= jsonProcessService.strToObj(jsonStr, Result.class);


這樣就不用在方法前加入(Result)類型強(qiáng)制轉(zhuǎn)換了。


上面只是我的一些拙見,還請同仁們多多指教。

相關(guān)文章

  • Java如何優(yōu)雅關(guān)閉異步中的ExecutorService

    Java如何優(yōu)雅關(guān)閉異步中的ExecutorService

    在并發(fā)編程領(lǐng)域,Java的ExecutorService是線程池管理的關(guān)鍵接口,這篇文章主要為大家介紹了如何優(yōu)雅關(guān)閉異步中的ExecutorService,需要的可以了解下
    2025-02-02
  • java List出現(xiàn)All elements are null問題及解決

    java List出現(xiàn)All elements are null問題及解決

    這篇文章主要介紹了java List出現(xiàn)All elements are null問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-11-11
  • 如何在springboot中配置和使用mybatis-plus

    如何在springboot中配置和使用mybatis-plus

    這篇文章主要給大家介紹了關(guān)于如何在springboot中配置和使用mybatis-plus的相關(guān)資料,MyBatis?Plus是MyBatis的增強(qiáng)版,旨在提供更多便捷的特性,減少開發(fā)工作,同時(shí)保留了MyBatis的靈活性和強(qiáng)大性能,需要的朋友可以參考下
    2023-11-11
  • Spring MVC 注解自動掃描失效原因分析

    Spring MVC 注解自動掃描失效原因分析

    這篇文章主要介紹了Spring MVC 注解自動掃描失效原因分析,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Java實(shí)現(xiàn)整數(shù)的逆序輸出的三種方法

    Java實(shí)現(xiàn)整數(shù)的逆序輸出的三種方法

    這篇文章主要介紹了Java實(shí)現(xiàn)整數(shù)的逆序輸出的三種方法,第一種是無限制整數(shù)的逆序輸出,第二種是非負(fù)整數(shù)的逆序輸出,第三種是非特殊情況的逆序輸出,每種方法給大家講解的非常詳細(xì)需要的朋友可以參考下
    2022-11-11
  • 本地MinIO存儲服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過程

    本地MinIO存儲服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過程

    MinIO是一款高性能、分布式的對象存儲系統(tǒng),它可以100%的運(yùn)行在標(biāo)準(zhǔn)硬件上,即X86等低成本機(jī)器也能夠很好的運(yùn)行MinIO,這篇文章主要介紹了本地MinIO存儲服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過程,需要的朋友可以參考下
    2023-11-11
  • 淺談Java并發(fā) J.U.C之AQS:CLH同步隊(duì)列

    淺談Java并發(fā) J.U.C之AQS:CLH同步隊(duì)列

    AQS內(nèi)部維護(hù)著一個FIFO隊(duì)列,該隊(duì)列就是CLH同步隊(duì)列。下面小編來簡單介紹下這個隊(duì)列
    2019-05-05
  • Java初學(xué)之繼承與多態(tài)

    Java初學(xué)之繼承與多態(tài)

    這篇文章主要介紹了Java 繼承與多態(tài)的深入理解的相關(guān)資料,子類繼承父類的特征和行為,使得子類具有父類的各種屬性和方法?;蜃宇悘母割惱^承方法,使得子類具有父類相同的行為,需要的朋友可以參考下
    2021-07-07
  • 詳解java_ 集合綜合案例:斗地主

    詳解java_ 集合綜合案例:斗地主

    這篇文章主要介紹了java_ 集合綜合案例:斗地主,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Hutool是一個Java基礎(chǔ)工具類,對文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評論

高陵县| 泸州市| 清苑县| 桂平市| 怀仁县| 临邑县| 汉源县| 卫辉市| 沭阳县| 新乐市| 尼勒克县| 定州市| 乌什县| 开远市| 宁乡县| 盐城市| 临泉县| 浦东新区| 瓮安县| 会泽县| 新龙县| 辰溪县| 鹤峰县| 长乐市| 荃湾区| 囊谦县| 咸阳市| 鹤山市| 山丹县| 屯昌县| 石河子市| 苍溪县| 绍兴县| 衢州市| 革吉县| 内江市| 徐水县| 长岛县| 合阳县| 龙井市| 长垣县|