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

歡迎訪問 生活随笔!

生活随笔

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

javascript

【Java】用Jackson进行JSON序列化/反序列化操作

發(fā)布時(shí)間:2025/3/15 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】用Jackson进行JSON序列化/反序列化操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java類和JSON

Speaker類:

import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Speaker {private int id;private int age;private String fullName;private List<String> tags = new ArrayList<>(); private boolean registered;public Speaker() {super();}public Speaker(int id, int age, String fullName, List<String> tags, boolean registered) {super();this.id = id;this.age = age;this.fullName = fullName;this.tags = tags;this.registered = registered;}public Speaker(int id, int age, String fullName, String[] tags, boolean registered) {this(id, age, fullName, Arrays.asList(tags), registered);}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFullName() {return fullName;}public void setFullName(String fullName) {this.fullName = fullName;}public List<String> getTags() {return tags;}public void setTags(List<String> tags) {this.tags = tags;}public boolean isRegistered() {return registered;}public void setRegistered(boolean registered) {this.registered = registered;}@Overridepublic String toString() {return String.format("Speaker [id=%s, age=%s, fullName=%s, tags=%s, registered=%s]", id, age, fullName, tags,registered);}}

JSON文件

speaker.json

{"id": 1,"fullName": "Larson Richard","tags": ["JavaScript", "AngularJS", "Yeoman"],"age": 39,"registered": true }

speakers.json

{"speakers": [{"id": 1,"fullName": "Larson Richard","tags": ["JavaScript","AngularJS","Yeoman"],"age": 39,"registered": true},{"id": 2,"fullName": "Ester Clements","tags": ["REST","Ruby on Rails","APIs"],"age": 29,"registered": true},{"id": 3,"fullName": "Christensen Fisher","tags": ["Java","Spring","Maven","REST"],"age": 45,"registered": false}] }

對Java簡單數(shù)據(jù)類型進(jìn)行序列化/反序列化操作

這里的簡單數(shù)據(jù)類型是指:

  • 整數(shù)型
  • 字符串
  • 數(shù)組
  • 布爾值

下面的單元測試程序應(yīng)用了Jackson和JUnit4對Java中的簡單數(shù)據(jù)類型進(jìn)行序列化/反序列化操作:

import static org.junit.Assert.*;import java.io.*; import java.util.*;import org.junit.Test;import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.type.*; import com.fasterxml.jackson.databind.*;public class BasicJsonTypesTest {private static final String TEST_SPEAKER = "age = 39\n" + "fullName = \"Larson Richard\"\n" +"tags = [\"JavaScript\",\"AngularJS\",\"Yeoman\"]\n" + "registered = true";@Testpublic void serializeBasicTypes() {try {ObjectMapper mapper = new ObjectMapper();Writer writer = new StringWriter();int age = 39;String fullName = new String("Larson Richard");List<String> tags = new ArrayList<String>(Arrays.asList("JavaScript", "AngularJS", "Yeoman"));boolean registered = true;String speaker = null;writer.write("age = ");mapper.writeValue(writer, age);writer.write("\nfullName = ");mapper.writeValue(writer, fullName);writer.write("\ntags = ");mapper.writeValue(writer, tags);writer.write("\nregistered = ");mapper.configure(SerializationFeature.INDENT_OUTPUT, true);mapper.writeValue(writer, registered);speaker = writer.toString();System.out.println(speaker);assertTrue(TEST_SPEAKER.equals(speaker));assertTrue(true);} catch (JsonGenerationException jge) {jge.printStackTrace();fail(jge.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}@Testpublic void deSerializeBasicTypes() {try {String ageJson = "{ \"age\": 39 }";ObjectMapper mapper = new ObjectMapper();Map<String, Integer> ageMap = mapper.readValue(ageJson,new TypeReference<HashMap<String,Integer>>() {});Integer age = ageMap.get("age");System.out.println("age = " + age + "\n\n\n");assertEquals(39, age.intValue());assertTrue(true);} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}}

在上面的實(shí)例中,由于@Test注解的聲明,JUnit會將serializeBasicTypes()和deSerializeBasicTypes()方法作為測試的一部分來運(yùn)行。對于JSON數(shù)據(jù)自身來說,這些單元測試用例并未執(zhí)行太多斷言操作。

歸納一下,以下是Jackson中用于JSON序列化/反序列化的一些重要的類和方法:

  • ObjectMapper 類負(fù)責(zé)在Java和JSON之間進(jìn)行相互轉(zhuǎn)換。
  • ObjectMapper.writeValue() 方法負(fù)責(zé)將Java數(shù)據(jù)類型轉(zhuǎn)換為JSON(本例中轉(zhuǎn)換結(jié)果被輸出到Writer對象中)。
  • ObjectMapper.readValue() 方法負(fù)責(zé)阿靜JSON轉(zhuǎn)換為Java數(shù)據(jù)結(jié)構(gòu)。

對Java對象進(jìn)行序列化/反序列化操作

如果只是對簡單數(shù)據(jù)類型進(jìn)行序列化/反序列化,并沒有什么有趣的功能。下面是對Java對象進(jìn)行的操作,這時(shí)序列化/反序列化顯得比較有用。

下面的程序展示了如何用Jackson來序列化/反序列化speaker對象,同時(shí)也展示了如何將JSON文件反序列化為多個(gè)speaker對象:

import static org.junit.Assert.*;import java.io.*; import java.net.*; import java.util.*;import org.junit.Test;import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.type.*;public class SpeakerJsonFlatFileTest {private static final String SPEAKER_JSON_FILE_NAME = "speaker.json";private static final String SPEAKERS_JSON_FILE_NAME = "speakers.json";private static final String TEST_SPEAKER_JSON = "{\n" + " \"id\" : 1,\n" + " \"age\" : 39,\n" + " \"fullName\" : \"Larson Richard\",\n" + " \"tags\" : [ \"JavaScript\", \"AngularJS\", \"Yeoman\" ],\n" + " \"registered\" : true\n" + "}";@Testpublic void serializeObject() {try {ObjectMapper mapper = new ObjectMapper();String[] tags = {"JavaScript", "AngularJS", "Yeoman"};Speaker speaker = new Speaker(1, 39, "Larson Richard", tags, true);String speakerStr = null;mapper.configure(SerializationFeature.INDENT_OUTPUT, true);speakerStr = mapper.writeValueAsString(speaker); System.out.println(speakerStr);assertTrue(TEST_SPEAKER_JSON.equals(speakerStr));assertTrue(true);} catch (JsonGenerationException jge) {jge.printStackTrace();fail(jge.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}private File getSpeakerFile(String speakerFileName) throws URISyntaxException {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();URL fileUrl = classLoader.getResource(speakerFileName);URI fileUri = new URI(fileUrl.toString());File speakerFile = new File(fileUri);return speakerFile;}@Testpublic void deSerializeObject() {try {ObjectMapper mapper = new ObjectMapper();File speakerFile = getSpeakerFile(SpeakerJsonFlatFileTest.SPEAKER_JSON_FILE_NAME);Speaker speaker = mapper.readValue(speakerFile, Speaker.class);System.out.println("\n" + speaker + "\n");assertEquals("Larson Richard", speaker.getFullName());assertEquals(39, speaker.getAge()); assertTrue(true);} catch (URISyntaxException use) {use.printStackTrace();fail(use.getMessage());} catch (JsonParseException jpe) {jpe.printStackTrace();fail(jpe.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}@Testpublic void deSerializeMultipleObjects() {try {ObjectMapper mapper = new ObjectMapper();File speakersFile = getSpeakerFile(SpeakerJsonFlatFileTest.SPEAKERS_JSON_FILE_NAME);JsonNode arrNode = mapper.readTree(speakersFile).get("speakers");List<Speaker> speakers = new ArrayList<Speaker>();if (arrNode.isArray()) {for (JsonNode objNode : arrNode) {System.out.println(objNode);speakers.add(mapper.convertValue(objNode, Speaker.class));}}assertEquals(3, speakers.size());System.out.println("\n\n\nAll Speakers\n");for (Speaker speaker: speakers) {System.out.println(speaker);}System.out.println("\n");Speaker speaker3 = speakers.get(2);assertEquals("Christensen Fisher", speaker3.getFullName());assertEquals(45, speaker3.getAge()); assertTrue(true);} catch (URISyntaxException use) {use.printStackTrace();fail(use.getMessage());} catch (JsonParseException jpe) {jpe.printStackTrace();fail(jpe.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}}

之前的測試用例均使用了JUnit中的斷言方法來測試JSON序列化/反序列化的結(jié)果。

對于以上的JUnit單元測試,以下幾點(diǎn)值得一提:

  • serializeObject()方法創(chuàng)建了一個(gè)Speaker對象,然后使用ObjectMapper.writeValueAsString()和System.out.println()將其序列化并打印到標(biāo)準(zhǔn)輸出。測試代碼將SerializationFeature、INDENT_OUTPUT設(shè)置為true,以優(yōu)化JSON輸出中的縮進(jìn)和顯示。
  • deSerializeObject()方法調(diào)用getSpeakerFile()來讀取包含speaker對象的JSON輸入文件,然后使用ObjectMapper.readValue()將其反序列化為SpeakerJava對象。
  • deSerializeMultipleObjects()方法執(zhí)行了以下操作:
    • 調(diào)用getSpeakerFile()來讀取包含speaker對象數(shù)組的JSON輸入文件。
    • 調(diào)用ObjectMapper.readTree()來獲取JsonNode對象,該對象指向文件中的JSON文檔的根結(jié)點(diǎn)。
    • 訪問JSON樹中的每個(gè)結(jié)點(diǎn),并使用ObjectMapper.convertValue()方法將結(jié)點(diǎn)中的speaker數(shù)據(jù)反序列化為Java中的Speaker對象。
    • 打印列表中的所有Speaker對象。
  • getSpeakerFile()方法會查找類路徑中相應(yīng)的文件,并執(zhí)行以下操作:
    • 從當(dāng)前執(zhí)行線程獲取ContextClassLoader對象。
    • 使用ClassLoader.getResource()方法從當(dāng)前類路徑中查找相關(guān)文件資源。
    • 根據(jù)文件名的URI創(chuàng)建FIle對象。

總結(jié)

以上是生活随笔為你收集整理的【Java】用Jackson进行JSON序列化/反序列化操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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