jackson (json、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);是不支持的。
更多推荐
所有评论(0)