一文搞定Jackson解析JSON數(shù)據

Json解析-Jackson使用教程

日常求贊蝗肪,感謝老板币喧。

歡迎關注公眾號:其實是白羊屡贺。干貨持續(xù)更新中......

[圖片上傳失敗...(image-1ef3ea-1585817742481)]

一硼身、JSON解析

我這里指的解析是:JSON和JavaObject之間的序列化和反序列化翘贮。

如果你的項目進行了前后端分離幻赚,那你一定使用過JSON進行數(shù)據交互禀忆,那在后端就一定會涉及到對Json數(shù)據的解析,雖然使用SpringMvc加上@requestBody都已經幫我們解析好并映射到bean里了落恼,但是他底層也是通過這些JSON解析類庫來完成的(SpringMVC默認使用的就是Jackson)箩退。在我們后端直接調其他服務的接口時,很多也會返回JSON數(shù)據也需要我們自己使用這些類庫來進行解析领跛。

二乏德、常見的JSON解析類庫

  • fastjson:阿里出品的一個JSON解析類庫,很快吠昭,提供了很多靜態(tài)方法使用方便喊括,但是底層實現(xiàn)不是很好,解析過程中使用String的substring矢棚,性能很好郑什,但是可能會導致內存泄漏。
  • Gson:谷歌出品的JSOn解析類庫蒲肋,但是性能相較于其他連個稍微差點蘑拯。
  • Jackson:相對比較推薦的一種JSON解析類庫,性能好穩(wěn)定兜粘。Jackson的源代碼托管在:https://github.com/FasterXML/jackson申窘。

三、Jackson使用

1孔轴、Maven依賴引入

<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-databind</artifactId>  
      <version>${jackson-version}</version>  
</dependency>  
<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-core</artifactId>  
      <version>${jackson-version}</version>  
</dependency>  
<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-annotations</artifactId>  
      <version>${jackson-version}</version>  
</dependency> 
<!-- 其中Jackson Annotations依賴Jackson Core剃法,Jackson Databind依賴Jackson Annotations。-->

2路鹰、基本使用

反序列化

  1. 使用ObjectMapper贷洲,將json字符串轉成對象:
String str = "{\"id\":1,\"name\":\"haha\",\"elements\":[{\"age\":1,\"elName\":\"zll\"},{\"age\":2,\"elName\":\"zll1\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
TestBean testBean = objectMapper.readValue(str, TestBean.class);
System.out.println(testBean.toString());

運行結果:

TestBean(id=1, name=haha, elements=[Element(age=1, elName=zll), Element(age=2, elName=zll1)])
  1. 使用ObjectMapper收厨,讀取json某些字段值
        String str = "{\"id\":1,\"name\":\"haha\",\"elements\":[{\"age\":1,\"elName\":\"zll\"},{\"age\":2,\"elName\":\"zll1\"}]}";
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(str);
        //獲取name字段值
        JsonNode name = jsonNode.get("name");
        String s = name.asText();
        System.out.println(s);
        //獲取elements字段下數(shù)組第二個對象的age
        JsonNode elements = jsonNode.get("elements");
        JsonNode object2 = elements.get(1);//從0開始哦
        JsonNode age = object2.get("age");
        int i = age.asInt();
        System.out.println(i);

運行結果:

haha
2

序列化

  1. ObjectMapper(將JavaObject轉化成JSON)
Element element = new Element();
element.setAge(1);
element.setElName("zll");
ObjectMapper objectMapper = new ObjectMapper();
String elementStr = objectMapper.writeValueAsString(element);
System.out.println(elementStr);

輸出結果如下:

{"age":1,"elName":"zll"}

其他常用序列化方法:

  • writeValue(File arg0, Object arg1)把arg1轉成json序列,并保存到arg0文件中
  • writeValue(OutputStream arg0, Object arg1)把arg1轉成json序列优构,并保存到arg0輸出流中诵叁。
  • teValueAsBytes(Object arg0)把arg0轉成json序列,并把結果輸出成字節(jié)數(shù)組
  • writeValueAsString(Object arg0)把arg0轉成json序列钦椭,并把結果輸出成字符串拧额。
  1. JsonGenerator(json生成器):

可以根據自己的需要創(chuàng)建相應結構的json

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        //JsonFactory jsonFactory = new JsonFactory();
        //創(chuàng)建jsonfactory 2種方法
        ObjectMapper objectMapper = new ObjectMapper();
        JsonFactory jsonFactory = objectMapper.getFactory();
        JsonGenerator generator = jsonFactory.createGenerator(bout);
        //創(chuàng)建自己需要的json
        //創(chuàng)建對象獲取數(shù)組要寫開始和結束
        generator.writeStartObject();
            //創(chuàng)建一個字段 第一個參數(shù)key 第二個參數(shù)value
            generator.writeStringField("name","value");
            generator.writeNumberField("numberName",1);
            //或者直接創(chuàng)建object
            generator.writeObjectField("ObjectName","ObjectValue");
            //創(chuàng)建數(shù)組
            generator.writeArrayFieldStart("arrayName");
                //里面可以是對象、數(shù)組彪腔、字符串势腮、數(shù)字
                generator.writeString("element1");
                generator.writeNumber(1);
                generator.writeNumber(1);
            generator.writeEndArray();
        generator.writeEndObject();
        generator.flush();
        generator.close();
        String s = bout.toString();
        System.out.println(s);

執(zhí)行結果:

{"name":"value","numberName":1,"ObjectName":"ObjectValue","arrayName":["element1",1,1]}

2、ObjectMapper的常用設置

ObjectMapper objectMapper = new ObjectMapper();  
 
//序列化的時候序列對象的所有屬性  
objectMapper.setSerializationInclusion(Include.ALWAYS);  
 
//反序列化的時候如果多了其他屬性,不拋出異常  
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);  
 
//如果是空對象的時候,不拋異常  
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);  
 
//屬性為null的轉換
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 
//取消時間的轉化格式,默認是時間戳,可以取消,同時需要設置要表現(xiàn)的時間格式  
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);  
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

3漫仆、常用注解

  1. @JsonIgnoreProperties(ignoreUnknown = true):

將這個注解加載類上捎拯,不存在的字段將被忽略。

  1. @JsonIgnoreProperties({ “password”, “secretKey” }):

指定忽略字段

  1. @JsonIgnore:

標在注解上盲厌,將忽略此字段

  1. @JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”):

標在時間自端上序列化是使用制定規(guī)則格式化(默認轉化成時間戳)

  1. @JsonInclude(參數(shù))

JsonInclude.Include.NON_EMPTY:屬性為空或者null都不參與序列化
JsonInclude.Include.NON_NULL:屬性為null不參與序列化

  1. @JsonProperty("firstName")

標在字段上署照,指定序列化后的字段名

  1. @JsonDeserialize(using= T extends JsonDeserializer<FiledType>.class)和@JsonSerialize(using= T extends JsonSerializer<FiledType>.class)

自定義某些類型字段的序列化與反序列化規(guī)則

四、最后

總結內容

更多資源:其實是白羊

歡迎star

日常求贊

  • 如果你認為本文對你有幫助吗浩,還請「在看/轉發(fā)/贊/star」建芙,多謝
  • 如果你還發(fā)現(xiàn)了更好或不同的想法,還請在留言區(qū)不吝賜教懂扼,一起探討交流修改禁荸,萬分感謝

歡迎關注公眾號:「其實是白羊」干貨持續(xù)更新中......

[圖片上傳失敗...(image-e396e3-1585817742481)]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阀湿,隨后出現(xiàn)的幾起案子赶熟,更是在濱河造成了極大的恐慌,老刑警劉巖陷嘴,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件映砖,死亡現(xiàn)場離奇詭異,居然都是意外死亡灾挨,警方通過查閱死者的電腦和手機邑退,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳澄,“玉大人地技,你說我怎么就攤上這事∶氚危” “怎么了莫矗?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我趣苏,道長,這世上最難降的妖魔是什么梯轻? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任食磕,我火速辦了婚禮,結果婚禮上喳挑,老公的妹妹穿的比我還像新娘彬伦。我一直安慰自己,他們只是感情好伊诵,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布单绑。 她就那樣靜靜地躺著,像睡著了一般曹宴。 火紅的嫁衣襯著肌膚如雪搂橙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天笛坦,我揣著相機與錄音区转,去河邊找鬼。 笑死版扩,一個胖子當著我的面吹牛废离,可吹牛的內容都是我干的。 我是一名探鬼主播礁芦,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜻韭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柿扣?” 一聲冷哼從身側響起肖方,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎未状,沒想到半個月后窥妇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡娩践,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年活翩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻伺。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡材泄,死狀恐怖,靈堂內的尸體忽然破棺而出吨岭,到底是詐尸還是另有隱情拉宗,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站旦事,受9級特大地震影響魁巩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜姐浮,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一谷遂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卖鲤,春花似錦肾扰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至区匣,卻和暖如春偷拔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亏钩。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工条摸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铸屉。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓钉蒲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彻坛。 傳聞我的和親對象是個殘疾皇子顷啼,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • 1. JSON 是什么 JSON(JavaScript Object Notation)是一種輕量級的數(shù)據交換格式...
    cbw100閱讀 468評論 0 3
  • 轉載自:https://www.ibm.com/developerworks/cn/java/jackson-ad...
    醬紫_Johns閱讀 1,523評論 0 4
  • Jackson JSON工具包包含一組Java注釋,您可以使用它們來影響如何將JSON讀入對象昌屉,或者從對象生成JS...
    誰在烽煙彼岸閱讀 7,224評論 0 6
  • 世人也說:“錢可以買到房屋间驮,卻買不到溫暖;錢可以買到藥品躬厌,卻買不到健康;錢可以買到書本,卻買不到智慧;錢可以買到床...
    ec08e92700a4閱讀 419評論 0 0
  • 1 在紙的中心畫上主題竞帽。 2 主脈呈現(xiàn)放射狀扛施,主脈從粗到細寫上第1個主要的概念標題,以關鍵詞方式填寫屹篓,畫上線條...
    小英子_e2e4閱讀 270評論 0 0