jackson基本包:jackson-core、jackson-databind、jackson-annotations
xml功能:jackson-dataformat-xml(jdk9及以上需要引入JAXB包)
xml高效类库:woodstox-core
jdk8支持:jackson-datatype-jsr310、jackson-module-parameter-names、jackson-datatype-jdk8
maven引入:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-parameter-names -->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jdk8 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.9.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.woodstox/stax2-api -->
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>stax2-api</artifactId>
<version>4.1</version>
</dependency>
<!-- JAXB start -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- JAXB end -->
Demo:
/**
* 2019年1月9日下午3:04:07
*/
package testJackson;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
/**
* @author XWF
*
*/
public class TestJackson {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
TestJackson testJackson = new TestJackson();
System.out.println("===============pojo,map==================");
testJackson.test1();
System.out.println("=================标签================");
testJackson.test2();
System.out.println("=================树================");
testJackson.test3();
System.out.println("=================流================");
testJackson.test4();
System.out.println("=================jdk8日期================");
testJackson.test5();
System.out.println("=================xml================");
testJackson.test6();
}
//pojo,map
public void test1() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Stu stu = new Stu();
stu.setName("雷克斯");
stu.setAge(23);
String jsonStr = objectMapper.writeValueAsString(stu);
System.out.println(jsonStr);
Stu newStu = objectMapper.readValue(jsonStr,Stu.class);
System.out.println(newStu);
Map<Integer,String> map = new HashMap<>();
map.put(1, "小光");
map.put(2, "小焰");
String jsonmap = objectMapper.writeValueAsString(map);
System.out.println(jsonmap);
Map<Integer,String> map2 = objectMapper.readValue(jsonmap, new TypeReference<Map<Integer,String>>() {});//指定map类型
System.out.println(map2);
}
//标签
public void test2() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);//关闭空bean异常(允许序列化空类)
// objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);//同上
objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);//启用数字时间戳
// objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);//同上
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);//关闭不识别属性异常
objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);//启用将字符串""转成null
// objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);//开启@JsonRootName注解指定的外层rootname
Stu2 stu2 = new Stu2();
stu2.setName("林克");
stu2.setAge(22);
stu2.setTel("1234567890");
stu2.setAddress("海拉鲁");
stu2.setEmail("linke@xx.xx");
String jsonStr = objectMapper.writeValueAsString(stu2);
System.out.println(jsonStr);
Stu2 newStu2 = objectMapper.readValue(jsonStr, Stu2.class);
System.out.println(newStu2);
String otherJson = "{\"StuName\":\"林克\",\"StuAge\":22,\"tel\":\"5432109876\",\"other\":\"abcde\"}";
Stu2 otherStu2 = objectMapper.readValue(otherJson, Stu2.class);
System.out.println(otherStu2);
}
//树
public void test3() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objNode = objectMapper.createObjectNode();
objNode.put("platform", "switch");
ArrayNode arrayNode = objectMapper.createArrayNode();
arrayNode.add("塞尔达");
arrayNode.add("奥德赛");
objNode.set("name", arrayNode);
String jsonStr = objectMapper.writeValueAsString(objNode);
System.out.println(jsonStr);
String json = "{\"game\":\"宝可梦\",\"names\":[{\"name\":\"皮卡丘\",\"age\":12},{\"name\":\"伊布\",\"age\":11}]}";
ObjectMapper objMapper = new ObjectMapper();
JsonNode rootNode = objMapper.readTree(json);
String game = rootNode.path("game").asText();
System.out.println("game>"+game);
ArrayNode node = (ArrayNode) rootNode.get("names");
if(node.isArray()) {
for(JsonNode n:node) {
System.out.println("name>>"+n.path("name")+",age>>"+n.path("age"));
}
}
}
//流
public void test4() throws IOException {
JsonFactory factory = new JsonFactory();
File f = new File("jackson.json");
JsonGenerator jsonGenerator = factory.createGenerator(f, JsonEncoding.UTF8);
//start
jsonGenerator.writeStartObject();
//hello
jsonGenerator.writeStringField("hello", "world");
//array
jsonGenerator.writeFieldName("array");
jsonGenerator.writeStartArray();
jsonGenerator.writeString("a");
jsonGenerator.writeString("b");
jsonGenerator.writeString("c");
jsonGenerator.writeEndArray();
//arrayObj
jsonGenerator.writeFieldName("arrayObj");
jsonGenerator.writeStartArray(2);
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("aaa", "bbb");
jsonGenerator.writeStringField("XX", "xx");
jsonGenerator.writeEndObject();
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("ccc", "ddd");
jsonGenerator.writeStringField("YY", "yy");
jsonGenerator.writeEndObject();
jsonGenerator.writeEndArray();
//end
jsonGenerator.writeEndObject();
jsonGenerator.close();
//读取json
JsonParser jsonParser = factory.createParser(new File("jackson.json"));
while(!jsonParser.isClosed()) {
JsonToken token = jsonParser.currentToken();
//token的值
// System.out.println(token);
// null
// START_OBJECT
// FIELD_NAME
// VALUE_STRING
// FIELD_NAME
// START_ARRAY
// VALUE_STRING
// VALUE_STRING
// VALUE_STRING
// END_ARRAY
// FIELD_NAME
// START_ARRAY
// START_OBJECT
// FIELD_NAME
// VALUE_STRING
// FIELD_NAME
// VALUE_STRING
// END_OBJECT
// START_OBJECT
// FIELD_NAME
// VALUE_STRING
// FIELD_NAME
// VALUE_STRING
// END_OBJECT
// END_ARRAY
// END_OBJECT
if(JsonToken.FIELD_NAME.equals(token)) {
String currentName = jsonParser.currentName();
if("hello".equals(currentName)) {
token = jsonParser.nextToken();
System.out.println("hello>"+jsonParser.getValueAsString());
}else if("array".equals(currentName)) {
System.out.println("array>");
if(JsonToken.START_ARRAY.equals(jsonParser.nextToken())) {
while(JsonToken.VALUE_STRING.equals(jsonParser.nextToken())) {
System.out.println(">>"+jsonParser.getValueAsString());
}
}
}else if("arrayObj".equals(currentName)) {
System.out.println("arrayObj>");
if(JsonToken.START_ARRAY.equals(jsonParser.nextToken())) {
while(JsonToken.START_OBJECT.equals(jsonParser.nextToken())) {
token = jsonParser.nextToken();//FIELD_NAME
System.out.print(">>"+jsonParser.getValueAsString()+":");
token = jsonParser.nextToken();//VALUE_STRING
System.out.print(jsonParser.getValueAsString()+";");
token = jsonParser.nextToken();//FIELD_NAME
System.out.print(jsonParser.getValueAsString()+":");
token = jsonParser.nextToken();//VALUE_STRING
System.out.println(jsonParser.getValueAsString());
token = jsonParser.nextToken();//END_OBJECT
}
}
}
}
jsonParser.nextToken();
}
}
//jdk8日期支持
public void test5() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(new ParameterNamesModule());
objectMapper.registerModule(new Jdk8Module());
// objectMapper.findAndRegisterModules();//自动搜索注册所有模块
Jdk8Date jdk8Date = new Jdk8Date();
jdk8Date.setName("jdk8");
jdk8Date.setDate(LocalDate.of(2019, 1, 16));
String jsonStr = objectMapper.writeValueAsString(jdk8Date);
System.out.println("jdk8Date json:"+jsonStr);
Jdk8Date date2 = objectMapper.readValue(jsonStr, Jdk8Date.class);
System.out.println(date2);
}
//处理xml
public void test6() throws IOException {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.findAndRegisterModules();
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);//格式化输出
XmlStu xmlStu = new XmlStu();
xmlStu.setName("hello");
xmlStu.setDesc("world");
xmlStu.setAge(12);
xmlStu.setSex("boy");
xmlStu.setTel("12345654321");
xmlStu.setBir(LocalDate.of(2019, 1, 16));
String xml = xmlMapper.writeValueAsString(xmlStu);
System.out.println(xml);
XmlStu xmlstu2 = xmlMapper.readValue(xml, XmlStu.class);
System.out.println(xmlstu2);
}
}
class Stu{
private String name;
private int age;
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;
}
@Override
public String toString() {
return name+","+age;
}
}
@JsonRootName("Student")
@JsonIgnoreProperties({"tel", "address"})
class Stu2{
@JsonProperty
private String other;
@JsonProperty("StuName")
private String name;
@JsonProperty("StuAge")
private int age;
private String tel;
private String address;
@JsonIgnore
private String email;
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 getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return other+"-"+name+">"+age+">"+tel+">"+address+">"+email;
}
}
@JsonRootName("Jdk8Date")
class Jdk8Date{
@JsonProperty
private String name;
@JsonProperty
@JsonFormat(pattern = "yyyy年MM月DD日")
private LocalDate date;
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "name="+name+",date="+date;
}
}
@JsonRootName("xmlstu")
class XmlStu{
@JacksonXmlProperty
private String name;
@JacksonXmlProperty
@JacksonXmlText//无标签普通文本
private String desc;
@JacksonXmlProperty(localName = "Age")
private int age;
@JacksonXmlProperty(localName = "SEX",isAttribute = true)
private String sex;
@JacksonXmlProperty
@JacksonXmlCData//CDATA标签中
private String tel;
@JacksonXmlProperty
@JsonFormat(pattern = "yyyy.MM.DD")
private LocalDate bir;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public LocalDate getBir() {
return bir;
}
public void setBir(LocalDate bir) {
this.bir = bir;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "name="+name+",desc="+desc+",age="+age+",sex="+sex+",tel="+tel+",bir="+bir;
}
}
结果:
参考:
https://blog.csdn.net/u011054333/article/details/80504154
https://blog.csdn.net/m0_37076574/article/details/81317403
https://github.com/FasterXML/jackson-dataformat-xml/wiki/Jackson-XML-annotations