目录

1.maven依赖

2.常用注解

3. 常用函数

3.1 自定义对象与json

3.2 泛型及实现类指定

3.3 缩进

3.4 代码示例

4. jsonNode

4.1 解析 node

4.2 生成node

6.xml


jackson用于java对象到 json 的序列化与反序列化。还支持xml格式。

应用场景: web service要实现跨机器传送对象, 那么就需要有一种技术能把对象转换为特定格式的信息。为了实现跨平台(比如把java对象转化为c#或c++对象),又考虑到方便人们阅读,所以基于字符串规则的转换是最理想的。json就是这样一个轻量级的数据交换格式,而jackson是一个实现该功能的很好用的框架。

1.maven依赖

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId> jackson-databind</artifactId>
	<version>2.9.7</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-annotations</artifactId>
	<version>2.9.7</version>
</dependency>

2.常用注解

@com.fasterxml.jackson.annotation.JsonPropertyOrder
指定序列化为json串时的各字段顺序
@com.fasterxml.jackson.annotation.JsonIgnoreProperties
指定序列化为json串时排除的一些字段

当 @JsonIgnoreProperties(ignoreUnknown = true)时, 用于反序列化时, jsonStr 中多余的field会被忽略, 否则报错 Unrecognized field异常.

例子:

@JsonAutoDetect
@JsonPropertyOrder(value = {"price", "name"})
@JsonIgnoreProperties(value = {"year"})
public class Book {
	public String name = "Physics";
	public String price = "123";
	public String year = "2015";
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Book wsBook(){
		return new Book();
	}
}


@com.fasterxml.jackson.annotation.JsonProperty
字段在序列化时只用指定的别名

3. 常用函数

com.fasterxml.jackson.databind.ObjectMapper.ObjectMapper()

核心类 ObjectMapper 的构造函数,得到的对象是线程安全的,建议在程序中作为静态成员直接用。

3.1 自定义对象 <---> json

<T> T com.fasterxml.jackson.databind.ObjectMapper.readValue(File src, Class<T> valueType)

从文件中直接反序列化,当然,文件中是json格式的字符串。

<T> T com.fasterxml.jackson.databind.ObjectMapper.readValue(String content,Class<T> valueType)

从字符串中反序列化。

public void writeValue(File resultFile, Object value)

将对象序列化到文件中去。文件是json格式的文本文件。

String com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(Object value) 

将对象序列化成json格式的string。

3.2 泛型及实现类指定

<T> T com.fasterxml.jackson.databind.ObjectMapper.readValue(URL src,TypeReference   valueTypeRef) 

反序列化时指定泛型参数。这个函数很有用,如:

public static ConcurrentHashMap<String,Integer> readMapFromFile(File file) throws JsonParseException, JsonMappingException, IOException{
		//new an anonymous class
		return objectMapper.readValue(file, new TypeReference<ConcurrentHashMap<String,Integer>>() {});
	}

# 例子二
String featuresStr="[[5.1,3.3,1.7,0.5],[5.0,2.3,3.3,1.0],[6.4,2.8,5.6,2.2]]";
ArrayList<ArrayList<Double>> c=objectMapper.readValue(featuresStr,new TypeReference<ArrayList<ArrayList<Double>>() {});

指定反序列化时的实现类: 如果是List接口,默认实现类是ArrayList。如果写明了LinkedList等,那么反序列化后就是LinkedList。

3.3 缩进

ObjectMapper objectMapper=new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);

此时序列化后的json带缩进,方便肉眼看。

3.4 代码示例

/**
 * jackson使用Sample
 * 1.类可以嵌套类
 * 2.类中的成员变量若为private权限,必须有public getter()方法,可以没有setter()方法
 * 3.类中的成员变量若为public权限,就不需要自己再写 getter()与setter()
 * 4.ObjectMapper is thread-safe
 */

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

class Book {
	private String name = "Physics";

	public String getName() {
		return name;
	}
	//
	// public void setName(String name) {
	// this.name = name;
	// }
}

class Student {
	private int age = 7;
	private int grade = 1;
	private String name = "XiaoMing";
	private Book book = new Book();

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int grade) {
		this.grade = grade;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Book getBook() {
		return book;
	}

	public void setBook(Book book) {
		this.book = book;
	}
}

public class A {
	static ObjectMapper objectMapper = new ObjectMapper();

	void serializeDemo() throws JsonProcessingException {
		Student student = new Student();
		System.out.println(objectMapper.writeValueAsString(student));
	}

	void deserializeDemo() throws JsonParseException, JsonMappingException,
			IOException {
		String json = "{\"age\":7,\"grade\":1,\"name\":\"XiaoMing\",\"book\":{\"name\":\"Physics\"}}";
		Student student = objectMapper.readValue(json, Student.class);
		System.out.println(student.getName());
	}

	public static void main(String[] args) throws IOException {
		A a = new A();
		System.out.println("serializeDemo:");
		a.serializeDemo();
		System.out.println("\ndeserializeDemo:");
		a.deserializeDemo();
	}

}
/*
 * serializeDemo:
 * {"age":7,"grade":1,"name":"XiaoMing","book":{"name":"Physics"}}
 * 
 * deserializeDemo: XiaoMing
 */

4. jsonNode

4.1 解析 node

场景: 有时我们没有完整的目标class定义, 无法反序列化. 但我们只关心其中部分字段, 就可以解析为 jsonNode格式.

com.fasterxml.jackson.databind.JsonNode

json同xml类似,背后的数据结构都是树。JsonNode 因此而来.

JsonNode com.fasterxml.jackson.databind.ObjectMapper.readTree(String content)

读取json,得到root节点。有多个重载, 也可直接读文件.

JsonNode com.fasterxml.jackson.databind.JsonNode.get(String fieldName)

获取指定的孩子node。若不存在返回null。

String com.fasterxml.jackson.databind.JsonNode.asText()

将当前节点的内容以string格式输出。

String com.fasterxml.jackson.databind.JsonNode.asText(String defaultValue)

当指定的节点不存在时返回形参中的默认值。

com.fasterxml.jackson.databind.node.ArrayNode

当处理数组时,就可以将JsonNode转为这个ArrayNode.

4.2 生成node

private JsonNodeFactory jsonNodeFactory = JsonNodeFactory.instance;
jsonNodeFactory.arrayNode();
jsonNodeFactory.objectNode();

# 或
objectMapper.createArrayNode();
objectMapper.createObjectNode();

5.xml

在以上依赖的基础上添加:

<dependency>
	<groupId>com.fasterxml.jackson.dataformat</groupId>
	<artifactId>jackson-dataformat-xml</artifactId>
	<version>2.13.1</version>
</dependency>

5.1 常用类与函数

com.fasterxml.jackson.dataformat.xml.XmlMapper
它是ObjectMapper类的子类,用于处理xml。

注意mapper.enable(SerializationFeature.INDENT_OUTPUT);是不支持的。

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐