欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
java中的json操作

前言

在java中進(jìn)行json操作其實(shí)并不是一個(gè)新的話(huà)題,我們已經(jīng)這樣使用了很多年,但是一直以來(lái),缺少標準。不過(guò)現在有了這個(gè)標準(其實(shí)有了幾年了),我們晚點(diǎn)再說(shuō)新的標準。在我的職業(yè)上生涯里,對json處理基本上就是fastjson、gson和jackson這樣三個(gè)庫占了主要地位。其中,fastjson多年前網(wǎng)傳是最快的,我沒(méi)測過(guò)。gson可能是用的最多的吧,因為操作簡(jiǎn)單,需要的配置少。jackson其實(shí)很多經(jīng)驗不足的人是不認識它的,但是抄帖子的時(shí)候其實(shí)見(jiàn)過(guò)這個(gè)名字,因為在springweb的框架里,它是默認的處理接口json序列化反序列化的框架,有的時(shí)候我們需要改它的配置就會(huì )見(jiàn)到它的身影,比如時(shí)間的序列化格式。

為什么現在討論這件事

其實(shí),這些使用場(chǎng)景對于我的編程模型并沒(méi)有多少改變,因為接口的json會(huì )被處理為java對象再被使用,其它地方也基本是這樣,至少最近我用了postgresql。這倒不是說(shuō)它帶來(lái)了多大的問(wèn)題,恰恰相反,它給我帶來(lái)了便利。它有個(gè)jsonb字段。我可以把異構對象直接用json結構存進(jìn)去,同時(shí)還可以針對字段建立索引,不要太方便。但是,他也給我帶來(lái)了挑戰。我用mybatis做dao層操作框架,json對象好存,不好讀呀。我該用什么實(shí)體類(lèi)型讀取它呢?由于最早期這部分不是我寫(xiě)的,他們選擇了直接使用我們操作json框架(fastjson)里的JSONObject作為實(shí)體屬性來(lái)操作,而且基于此寫(xiě)了不少代碼。但是,這個(gè)JSONObject是非標的,它屬于fastjson,其它的框架并不會(huì )使用這個(gè)數據結構。最近我在調試代碼的時(shí)候就動(dòng)了這個(gè)心思。有沒(méi)有java標準的json數據結構和操作結構呢?如果有,那么它就會(huì )被未來(lái)的各種庫所兼容,我也可以沒(méi)有顧忌的將它引入到我的基礎數據結構中,就像是map和hashmap。

JAVA的json標準

這個(gè)問(wèn)題的答案是,有的,而且,有了幾年了。由于時(shí)間原因和英文基礎,沒(méi)有去查英文的原文檔,而是搜了一些簡(jiǎn)單地資料。歸結下來(lái)是,有這樣幾個(gè)標準:JSR-353,JSR-374,JSR-367。而相關(guān)的java標準接口出現在了java ee 8中。注意,是JAVA EE而不是JAVA SE。其實(shí)最早在JAVA EE7 中就有了,那個(gè)時(shí)候是JSON-P接口,而在JAVA EE8中則變成了JSON-B。他們和JSR的對應關(guān)系我暫時(shí)就不理了,總是,現在是有標準的。它可以通過(guò)以下的maven依賴(lài)被引入,對的,它不在java的核心包中:

<dependency>    <groupId>jakarta.json.bind</groupId>    <artifactId>jakarta.json.bind-api</artifactId>    <version>1.0.2</version></dependency>

可以看到坐標里面寫(xiě)的是jakarta。這讓我想起來(lái)了,javaee開(kāi)源了,名字叫做jakarta,所以如果你找的是javax相關(guān)的包,會(huì )看到它有幾年沒(méi)更新了。

實(shí)現

兜兜轉轉,還是找到了一些權威的說(shuō)明網(wǎng)站,這里列舉兩個(gè)比較重要的:

關(guān)于引入的事情,在javaee的gibhub上說(shuō)得很詳細,只不過(guò)都是英文的罷了,這里我就只寫(xiě)依賴(lài)了(版本更新到了目前最新):

<!-- JSON-P --><dependency>    <groupId>org.glassfish</groupId>    <artifactId>jakarta.json</artifactId>    <version>1.1.6</version>    <scope>runtime</scope></dependency><!-- JSON-B API --><dependency>    <groupId>jakarta.json.bind</groupId>    <artifactId>jakarta.json.bind-api</artifactId>    <version>1.0.2</version></dependency><!-- Yasson (JSON-B implementation) --><dependency>    <groupId>org.eclipse</groupId>    <artifactId>yasson</artifactId>    <version>1.0.6</version>    <scope>runtime</scope></dependency>

嘗試

接下來(lái),我會(huì )對這一套內容進(jìn)行一些基本操作的嘗試,以確保它基本是滿(mǎn)足我的需求的。

基本的json對象序列化和反序列化

這里我設計了一個(gè)基本的測試,下面是實(shí)體對象和序列化反序列化代碼:

/** * 用來(lái)輔助json測試的對象 */public class JsonTestObject {    //int    private Integer intValue;    //short    private Short shortValue;    //long    private Long longValue;    //String    private String strValue;    //char    private char charValue;    //byte    private byte byteValue;    //byteArray    private Byte[] byteArray;    //double    private Double doubleValue;    //date    private Date dateValue;……getter and setter}    @Test    public void testSerialize(){        JsonTestObject jsonTestObject=new JsonTestObject();        jsonTestObject.setIntValue(Short.MAX_VALUE+1);        jsonTestObject.setShortValue((short) 1000);        jsonTestObject.setLongValue(Integer.MAX_VALUE+1l);        jsonTestObject.setStrValue("這是字符串");        jsonTestObject.setCharValue('字');        jsonTestObject.setByteValue((byte) 0x33);        jsonTestObject.setByteArray(new Byte[]{0x33,0x34,0x09});        jsonTestObject.setDoubleValue(3.141592653);        jsonTestObject.setDateValue(Calendar.getInstance().getTime());        Jsonb jsonb = JsonbBuilder.create();        String result = jsonb.toJson(jsonTestObject);        logger.debug("json序列化結果:"+result);        JsonTestObject desrializeObject=jsonb.fromJson(result,JsonTestObject.class);        logger.debug("結果:"+jsonb.toJson(desrializeObject));    }

上面可以看到我們對各種基本類(lèi)型都做了序列化和反序列化的測試,序列化的字符串如下(結果里沒(méi)有格式化,我自己格式化的):

{    "byteArray": [51, 52, 9],    "byteValue": 51,    "charValue": "字",    "dateValue": "2020-04-07T10:21:24.947Z[UTC]",    "doubleValue": 3.141592653,    "intValue": 32768,    "longValue": 2147483648,    "shortValue": 1000,    "strValue": "這是字符串"}

其實(shí),這里我最大的驚喜就是,它對byteArray的序列化。之前我使用fastjson序列化過(guò),反序列化回來(lái)就變成了字符串,這里是序列化成了整數數組,讓我感到很驚訝,這確實(shí)是個(gè)很好的解決方法。

日期序列化格式的修改

這個(gè)和其他的框架的操作是類(lèi)似的,對序列化操作實(shí)例進(jìn)行配置即可,我的代碼如下:

JsonbConfig jsonbConfig=new JsonbConfig();jsonbConfig.withDateFormat("yyyy-MM-dd HH:mm:ss",null);Jsonb jsonb = JsonbBuilder.create(jsonbConfig);

之前的創(chuàng )建是未使用配置類(lèi)的,其結果就是使用了默認的配置,我們這里對默認配置進(jìn)行了修改,這樣就可以了。如果還有其它的修改,也在這里配置然后再用來(lái)創(chuàng )建Jsonb即可。

對于無(wú)屬性的序列化和反序列化默認行為配置

在序列化的時(shí)候,我們可能需要對為null的對象進(jìn)行序列化,即沒(méi)有賦值,但是我有這個(gè)屬性。有些時(shí)候,這樣才是正確的,或者反過(guò)來(lái)??傊?,這個(gè)配置的調整是很常見(jiàn)的。

jsonbConfig.withNullValues(false);

這個(gè)設置起來(lái)也是很簡(jiǎn)單。其實(shí),大多數的配置都可以在JsonbConfig的方法中找到對應的方法。

將Long序列化為String

這個(gè)需求是在和前端進(jìn)行對接的時(shí)候遇到的。js里面并沒(méi)有Long這么長(cháng)的整數,如果硬傳過(guò)去,低三位會(huì )被置為零。為了解決這個(gè)問(wèn)題,我們把long轉化為String傳出去。之前這個(gè)序列化問(wèn)題都是使用Jackson配置的,在springboot的上,因為別的地方并不需要。
Jsonb中解決這個(gè)問(wèn)題使用的是一個(gè)叫做Adapter的概念。將序列化和反序列化進(jìn)行結對。我的代碼如下:

/** * Long類(lèi)型適配器 * 在js中,無(wú)法解析完整的Long長(cháng)度的整數,需要將其序列化為字符串后進(jìn)行解析 */public class LongAdapter implements JsonbAdapter<Long,String> {    @Override    public String adaptToJson(Long obj) throws Exception {        return String.valueOf(obj);    }    @Override    public Long adaptFromJson(String obj) throws Exception {        return Long.valueOf(obj);    }}

這就是為了在Long和String之間轉換的Adapter類(lèi)。它需要實(shí)現JsonbAdapter接口。下面是配置使用的代碼:

jsonbConfig.withAdapters(new LongAdapter());

這個(gè)是負責接收類(lèi)型為L(cháng)ong,json中類(lèi)型為String的相互轉換的,對于Long對Long的轉換并沒(méi)有實(shí)際影響。

集合反序列化

這個(gè)功能是沒(méi)有特殊的API的,不像fastjson里有個(gè)反序列化Array的方法,這里還是通過(guò)fromJson來(lái)做的

List<BaseJsonTest> result=JsonUtil.getJsonb().fromJson(jsonStr,new ArrayList<BaseJsonTest>(){}.getClass().getGenericSuperclass());

可以看到,獲取類(lèi)型的代碼有點(diǎn)長(cháng),有興趣可以自己封裝下。另外,經(jīng)過(guò)我測試,如果反序列化類(lèi)型直接為ArrayList,會(huì )被創(chuàng )建為HashMap,并執行成功,盡管類(lèi)型不匹配。然后在調用起對象的API時(shí)報錯找不到方法。這里似乎沒(méi)有繼承類(lèi)的概念,所以也不要想著(zhù)你寫(xiě)個(gè)基類(lèi)它給你返回一個(gè)派生類(lèi)。不過(guò)吧,有興趣可以自己弄個(gè)Adapter實(shí)現類(lèi)似的事情。具體原理我還沒(méi)想好,難點(diǎn)應該是在子類(lèi)的選擇上。如果集合里只有一個(gè)類(lèi),那就直接反序列化成對應的類(lèi)型就行了。

小結

至此,基本的json操作就差不多全了,也和常見(jiàn)的操作類(lèi)的功能差不多了。后面的就是自己封裝的擴展了,以后積累到一定程度再說(shuō)吧。
注:2018-03-05日,開(kāi)源組織Eclipse基金會(huì )宣布將JavaEE(Enterprise Edition)被更名為JakartaEE(雅加達)。這是Oracle將Java移交給開(kāi)源組織Eclipse后實(shí)現對Java品牌控制的最新舉措。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JSON Binding API 入門(mén),第 1 部分: JSON Binding API 簡(jiǎn)介
Redis入門(mén),我是認真的
Kubernetes官方j(luò )ava客戶(hù)端之二:序列化和反序列化問(wèn)題
利用gson將map轉為json示例
主流JSON引擎性能比較(GSON,FASTJSON,JACKSON,JSONSMART)
Spring Boot jackson配置使用詳解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久