一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 對Java中JSON解析器的一些見解

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

2019-10-23 14:12java教程網 Java教程

這篇文章主要是對Java中JSON解析器的一些見解。需要的朋友可以過來參考下,希望對大家有所幫助

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


sf-json最大的優點就是隨機讀取方便。代碼很簡單:

JSONObject json= JSONObject.fromObject(str);

然后讀取字段內容:

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

另外sf-json還有個優點就是自動使用unicode編碼,當內容中出現中文或者符號的時候會自動將其轉換為\uFFFF這樣的unicode編碼。這樣即便是在web服務器端的response中沒有設置編碼,直接推送json也不會出現亂碼問題。


fastjson,顧名思義就是快。網上已經有很多性能對比的數據了,我就不多說其性能了。

這里要說的就是它的功能性問題??赡苁嵌ㄎ徊灰粯?,最初fastjson就是要快,因此在對象的序列化與反序列化上下了很大功夫。但是在功能上有所缺乏。

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

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

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


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

例如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

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

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

public class DateDeserializer extends JsonDeserializer<Date>

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

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

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


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

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


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

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


這樣就不用在方法前加入(Result)類型強制轉換了。


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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女流白浆 | 国产成人精品第一区二区 | 91午夜在线观看 | 国产卡一卡二卡三乱码手机 | 91网站入口 | 成人免费体验区福利云点播 | 欧美黑大吊 | 欧美三级小说 | 日本一区视频 | 全黄一级裸片视频免费 | 欧美日韩一区二区三区在线播放 | 亚洲黄色网页 | 亚洲国产精品婷婷久久久久 | 扒开女人下面 | 成人aqq | 俄罗斯freeoo性另类 | 久久热这里面只有精品 | 91在线一区二区三区 | 婷婷色网| 91视频破解 | 91精品啪在线观看国产老湿机 | 欧美色图亚洲 | 四虎影库紧急大通知 | 国产精品国色综合久久 | 国产精品久久久久久久福利院 | 国产日韩高清一区二区三区 | 清纯漂亮女友初尝性过程 | 五月色婷婷网在线观看 | 亚洲第一区se | 公妇仑乱在线观看 | 欧美白虎逼| 日韩天堂网| 91精品手机国产在线观 | 明星ai智能人脸替换造梦在线播放 | 男同gay作爰视频网站 | 亚洲AV无码国产精品色午夜情 | 日本暖暖视频在线观看 | 99国产精品热久久久久久夜夜嗨 | 亚洲日本中文字幕天堂网 | 美女靠逼动漫 | 亚洲成年人免费网站 |