當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
【Java】用Jackson进行JSON序列化/反序列化操作
生活随笔
收集整理的這篇文章主要介紹了
【Java】用Jackson进行JSON序列化/反序列化操作
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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ù)類型進行序列化/反序列化操作
這里的簡單數(shù)據(jù)類型是指:
- 整數(shù)型
- 字符串
- 數(shù)組
- 布爾值
下面的單元測試程序應(yīng)用了Jackson和JUnit4對Java中的簡單數(shù)據(jù)類型進行序列化/反序列化操作:
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());}}}在上面的實例中,由于@Test注解的聲明,JUnit會將serializeBasicTypes()和deSerializeBasicTypes()方法作為測試的一部分來運行。對于JSON數(shù)據(jù)自身來說,這些單元測試用例并未執(zhí)行太多斷言操作。
歸納一下,以下是Jackson中用于JSON序列化/反序列化的一些重要的類和方法:
- ObjectMapper 類負責在Java和JSON之間進行相互轉(zhuǎn)換。
- ObjectMapper.writeValue() 方法負責將Java數(shù)據(jù)類型轉(zhuǎn)換為JSON(本例中轉(zhuǎn)換結(jié)果被輸出到Writer對象中)。
- ObjectMapper.readValue() 方法負責阿靜JSON轉(zhuǎn)換為Java數(shù)據(jù)結(jié)構(gòu)。
對Java對象進行序列化/反序列化操作
如果只是對簡單數(shù)據(jù)類型進行序列化/反序列化,并沒有什么有趣的功能。下面是對Java對象進行的操作,這時序列化/反序列化顯得比較有用。
下面的程序展示了如何用Jackson來序列化/反序列化speaker對象,同時也展示了如何將JSON文件反序列化為多個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單元測試,以下幾點值得一提:
- serializeObject()方法創(chuàng)建了一個Speaker對象,然后使用ObjectMapper.writeValueAsString()和System.out.println()將其序列化并打印到標準輸出。測試代碼將SerializationFeature、INDENT_OUTPUT設(shè)置為true,以優(yōu)化JSON輸出中的縮進和顯示。
- deSerializeObject()方法調(diào)用getSpeakerFile()來讀取包含speaker對象的JSON輸入文件,然后使用ObjectMapper.readValue()將其反序列化為SpeakerJava對象。
- deSerializeMultipleObjects()方法執(zhí)行了以下操作:
- 調(diào)用getSpeakerFile()來讀取包含speaker對象數(shù)組的JSON輸入文件。
- 調(diào)用ObjectMapper.readTree()來獲取JsonNode對象,該對象指向文件中的JSON文檔的根結(jié)點。
- 訪問JSON樹中的每個結(jié)點,并使用ObjectMapper.convertValue()方法將結(jié)點中的speaker數(shù)據(jù)反序列化為Java中的Speaker對象。
- 打印列表中的所有Speaker對象。
- getSpeakerFile()方法會查找類路徑中相應(yīng)的文件,并執(zhí)行以下操作:
- 從當前執(zhí)行線程獲取ContextClassLoader對象。
- 使用ClassLoader.getResource()方法從當前類路徑中查找相關(guān)文件資源。
- 根據(jù)文件名的URI創(chuàng)建FIle對象。
總結(jié)
以上是生活随笔為你收集整理的【Java】用Jackson进行JSON序列化/反序列化操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在小范围内[打表]验证哥德巴赫猜想(洛谷
- 下一篇: 【数据结构与算法】链式队列的Java实现