JavaDemo——jackson读写json和xml

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引入:


	
	    com.fasterxml.jackson.dataformat
	    jackson-dataformat-xml
	    2.9.8
	
	
	
	    com.fasterxml.jackson.datatype
	    jackson-datatype-jsr310
	    2.9.8
	
	
	
	    com.fasterxml.jackson.module
	    jackson-module-parameter-names
	    2.9.8
	
	
	
	    com.fasterxml.jackson.datatype
	    jackson-datatype-jdk8
	    2.9.8
	
	
	
	    org.codehaus.woodstox
	    stax2-api
	    4.1
	


	
	    javax.xml.bind
	    jaxb-api
	    2.2.11
	
	
	    com.sun.xml.bind
	    jaxb-core
	    2.2.11
	
	
	    com.sun.xml.bind
	    jaxb-impl
	    2.2.11
	
	
	    javax.activation
	    activation
	    1.1.1
	
	

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 map = new HashMap<>();
		map.put(1, "小光");
		map.put(2, "小焰");
		String jsonmap = objectMapper.writeValueAsString(map);
		System.out.println(jsonmap);
		Map map2 = objectMapper.readValue(jsonmap, new TypeReference>() {});//指定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("[email protected]");
		
		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;
	}
}

结果:

JavaDemo——jackson读写json和xml_第1张图片

 

参考:

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

https://blog.csdn.net/huanghanqian/article/details/80862874

https://www.yiibai.com/jackson/jackson_streaming_api.html

你可能感兴趣的:(JavaDemos,jackson,json,xml)