Java的Jackson庫(kù)的使用及其樹(shù)模型的入門(mén)學(xué)習(xí)教程
Jackson第一個(gè)程序
在進(jìn)入學(xué)習(xí)jackson庫(kù)的細(xì)節(jié)之前,讓我們來(lái)看看應(yīng)用程序操作功能。在這個(gè)例子中,我們創(chuàng)建一個(gè)Student類。將創(chuàng)建一個(gè)JSON字符串學(xué)生的詳細(xì)信息,并將其反序列化到學(xué)生的對(duì)象,然后將其序列化到JSON字符串。
創(chuàng)建一個(gè)名為JacksonTester在Java類文件 C:\>Jackson_WORKSPACE.
文件: JacksonTester.java
import java.io.IOException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";
//map json to student
try {
Student student = mapper.readValue(jsonString, Student.class);
System.out.println(student);
mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
jsonString = mapper.writeValueAsString(student);
System.out.println(jsonString);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int age;
public Student(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return "Student [ name: "+name+", age: "+ age+ " ]";
}
}
驗(yàn)證結(jié)果
使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運(yùn)行jacksonTester看到的結(jié)果:
C:\Jackson_WORKSPACE>java JacksonTester
驗(yàn)證輸出
Student [ name: Mahesh, age: 21 ]
{
"name" : "Mahesh",
"age" : 21
}
步驟 - 需要記住
以下是這里要考慮的重要步驟。
第1步:創(chuàng)建ObjectMapper對(duì)象。
創(chuàng)建ObjectMapper對(duì)象。它是一個(gè)可重復(fù)使用的對(duì)象。\
ObjectMapper mapper = new ObjectMapper();
第2步:反序列化JSON到對(duì)象。
從JSON對(duì)象使用readValue()方法來(lái)獲取。通過(guò)JSON字符串和對(duì)象類型作為參數(shù)JSON字符串/來(lái)源。
//Object to JSON Conversion Student student = mapper.readValue(jsonString, Student.class);
第3步:序列化對(duì)象到JSON。
使用writeValueAsString()方法來(lái)獲取對(duì)象的JSON字符串表示。
//Object to JSON Conversion jsonString = mapper.writeValueAsString(student);
Jackson樹(shù)模型
樹(shù)模型準(zhǔn)備JSON文件的內(nèi)存樹(shù)表示。 ObjectMapper構(gòu)建JsonNode節(jié)點(diǎn)樹(shù)。這是最靈活的方法。它類似于DOM解析器的XML。
從JSON創(chuàng)建樹(shù)
ObjectMapper提供一個(gè)指針樹(shù)的根節(jié)點(diǎn)在讀取JSON之后。根節(jié)點(diǎn)可用于遍歷完全樹(shù)??紤]下面的代碼片段獲得提供JSON字符串的根節(jié)點(diǎn)。
//Create an ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
//create tree from JSON
JsonNode rootNode = mapper.readTree(jsonString);
遍歷樹(shù)模型
使用相對(duì)路徑來(lái)根節(jié)點(diǎn)在遍歷樹(shù),并處理該數(shù)據(jù)得到的每個(gè)節(jié)點(diǎn)??紤]下面的代碼片段遍歷提供的根節(jié)點(diǎn)的樹(shù)。
JsonNode nameNode = rootNode.path("name");
System.out.println("Name: "+ nameNode.getTextValue());
JsonNode marksNode = rootNode.path("marks");
Iterator iterator = marksNode.getElements();
示例
創(chuàng)建一個(gè)名為JacksonTester在Java類文件目錄 C:\>Jackson_WORKSPACE.
File: JacksonTester.java
import java.io.IOException;
import java.util.Iterator;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
JacksonTester tester = new JacksonTester();
try {
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
JsonNode rootNode = mapper.readTree(jsonString);
JsonNode nameNode = rootNode.path("name");
System.out.println("Name: "+ nameNode.getTextValue());
JsonNode ageNode = rootNode.path("age");
System.out.println("Age: " + ageNode.getIntValue());
JsonNode verifiedNode = rootNode.path("verified");
System.out.println("Verified: " + (verifiedNode.getBooleanValue() ? "Yes":"No"));
JsonNode marksNode = rootNode.path("marks");
Iterator<JsonNode> iterator = marksNode.getElements();
System.out.print("Marks: [ ");
while (iterator.hasNext()) {
JsonNode marks = iterator.next();
System.out.print(marks.getIntValue() + " ");
}
System.out.println("]");
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
驗(yàn)證輸出結(jié)果
使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運(yùn)行jacksonTester看到結(jié)果:
C:\Jackson_WORKSPACE>java JacksonTester
驗(yàn)證輸出
Name: Mahesh Kumar Age: 21 Verified: No Marks: [ 100 90 85 ]
樹(shù)到JSON轉(zhuǎn)換
在這個(gè)例子中,我們已經(jīng)使用JsonNode并將其寫(xiě)入到一個(gè)JSON文件,并讀回創(chuàng)建了一棵樹(shù)。
創(chuàng)建一個(gè)名為JacksonTester在Java類文件目錄 C:\>Jackson_WORKSPACE.
File: JacksonTester.java
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
public class JacksonTester {
public static void main(String args[]){
JacksonTester tester = new JacksonTester();
try {
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.createObjectNode();
JsonNode marksNode = mapper.createArrayNode();
((ArrayNode)marksNode).add(100);
((ArrayNode)marksNode).add(90);
((ArrayNode)marksNode).add(85);
((ObjectNode) rootNode).put("name", "Mahesh Kumar");
((ObjectNode) rootNode).put("age", 21);
((ObjectNode) rootNode).put("verified", false);
((ObjectNode) rootNode).put("marks",marksNode);
mapper.writeValue(new File("student.json"), rootNode);
rootNode = mapper.readTree(new File("student.json"));
JsonNode nameNode = rootNode.path("name");
System.out.println("Name: "+ nameNode.getTextValue());
JsonNode ageNode = rootNode.path("age");
System.out.println("Age: " + ageNode.getIntValue());
JsonNode verifiedNode = rootNode.path("verified");
System.out.println("Verified: " + (verifiedNode.getBooleanValue() ? "Yes":"No"));
JsonNode marksNode1 = rootNode.path("marks");
Iterator<JsonNode> iterator = marksNode1.getElements();
System.out.print("Marks: [ ");
while (iterator.hasNext()) {
JsonNode marks = iterator.next();
System.out.print(marks.getIntValue() + " ");
}
System.out.println("]");
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
驗(yàn)證結(jié)果
使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運(yùn)行jacksonTester看到的結(jié)果:
C:\Jackson_WORKSPACE>java JacksonTester
驗(yàn)證輸出
Name: Mahesh Kumar
Age: 21
Verified: No
Marks: [ 100 90 85 ]
從樹(shù)到Java對(duì)象轉(zhuǎn)換
在這個(gè)例子中,我們已經(jīng)使用JsonNode并將其寫(xiě)入到一個(gè)JSON文件,并回讀然后將一個(gè)Student對(duì)象其轉(zhuǎn)換為創(chuàng)建了一棵樹(shù)。
創(chuàng)建一個(gè)名為JacksonTester在Java類文件目錄 C:\>Jackson_WORKSPACE.
File: JacksonTester.java
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
public class JacksonTester {
public static void main(String args[]){
JacksonTester tester = new JacksonTester();
try {
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.createObjectNode();
JsonNode marksNode = mapper.createArrayNode();
((ArrayNode)marksNode).add(100);
((ArrayNode)marksNode).add(90);
((ArrayNode)marksNode).add(85);
((ObjectNode) rootNode).put("name", "Mahesh Kumar");
((ObjectNode) rootNode).put("age", 21);
((ObjectNode) rootNode).put("verified", false);
((ObjectNode) rootNode).put("marks",marksNode);
mapper.writeValue(new File("student.json"), rootNode);
rootNode = mapper.readTree(new File("student.json"));
Student student = mapper.treeToValue(rootNode, Student.class);
System.out.println("Name: "+ student.getName());
System.out.println("Age: " + student.getAge());
System.out.println("Verified: " + (student.isVerified() ? "Yes":"No"));
System.out.println("Marks: "+Arrays.toString(student.getMarks()));
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
String name;
int age;
boolean verified;
int[] marks;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isVerified() {
return verified;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
public int[] getMarks() {
return marks;
}
public void setMarks(int[] marks) {
this.marks = marks;
}
}
驗(yàn)證結(jié)果
使用javac編譯如下類:
C:\Jackson_WORKSPACE>javac JacksonTester.java
現(xiàn)在運(yùn)行jacksonTester看到結(jié)果:
C:\Jackson_WORKSPACE>java JacksonTester
驗(yàn)證輸出
Name: Mahesh Kumar Age: 21 Verified: No Marks: [ 100 90 85 ]
- java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時(shí)間序列化
- Java下利用Jackson進(jìn)行JSON解析和序列化示例
- java的Jackson將json字符串轉(zhuǎn)換成泛型List
- java的Jackson框架實(shí)現(xiàn)輕易轉(zhuǎn)換JSON
- Java的Jackson庫(kù)中復(fù)雜對(duì)象集合的幾種簡(jiǎn)單轉(zhuǎn)換
- 舉例講解Java的Jackson庫(kù)中ObjectMapper類的使用
- 解析Java的Jackson庫(kù)中對(duì)象的序列化與數(shù)據(jù)泛型綁定
- 實(shí)例解析Java的Jackson庫(kù)中的數(shù)據(jù)綁定
- 使用Jackson來(lái)實(shí)現(xiàn)Java對(duì)象與JSON的相互轉(zhuǎn)換的教程
- 詳解Jackson的基本用法
相關(guān)文章
Java讀取網(wǎng)頁(yè)內(nèi)容并下載圖片的實(shí)例
這篇文章主要介紹了Java讀取網(wǎng)頁(yè)內(nèi)容并下載圖片的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
解決MyBatis中為類配置別名,列名與屬性名不對(duì)應(yīng)的問(wèn)題
這篇文章主要介紹了解決MyBatis中為類配置別名,列名與屬性名不對(duì)應(yīng)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
java反射調(diào)用方法NoSuchMethodException的解決方案
這篇文章主要介紹了java反射調(diào)用方法NoSuchMethodException的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot?Test的webEnvironment源碼解讀
這篇文章主要為大家介紹了SpringBoot?Test的webEnvironment源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
IDEA下使用MyBatisCodeHelper插件的方法詳解
這篇文章主要介紹了IDEA下使用MyBatisCodeHelper插件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
RestTemplate對(duì)HttpClient的適配源碼解讀
這篇文章主要為大家介紹了RestTemplate對(duì)HttpClient的適配源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
通過(guò)實(shí)例了解java checked和unchecked異常
這篇文章主要介紹了通過(guò)實(shí)例了解checked和unchecked異常,Java異常分為兩種類型,checked異常和unchecked異常,另一種叫法是異常和錯(cuò)誤。下面小編就帶大家來(lái)一起學(xué)習(xí)一下吧2019-06-06
SpringBoot集成ElasticSearch(ES)實(shí)現(xiàn)全文搜索功能
Elasticsearch是一個(gè)開(kāi)源的分布式搜索和分析引擎,它被設(shè)計(jì)用于處理大規(guī)模數(shù)據(jù)集,它提供了一個(gè)分布式多用戶能力的全文搜索引擎,本文將給大家介紹SpringBoot集成ElasticSearch(ES)實(shí)現(xiàn)全文搜索功能,需要的朋友可以參考下2024-02-02
SpringCloud OpenFeign基本介紹與實(shí)現(xiàn)示例
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開(kāi)發(fā),讓開(kāi)發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02

