Jackson2库基础用法-Java json 序列化
依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
用法示例
- 如何解析json字符串?
String json1 = "{\"name\":\"zhang\", \"age\":200,\"map\":{\"a\":\"b\"},\"list\":[{\"a\":0,\"b\":\"100\"},{\"a\":0,\"b\":\"100\"}]}";
ObjectMapper om = new ObjectMapper();
JsonNode root = om.readTree(json1);
String name = root.get("name").asText();
assertEquals("zhang",name);
int age = root.get("age").asInt();
assertEquals(200,age);
assertEquals("100",root.get("list").get(1).get("b").asText());
JsonNode map = root.get("map");
if(map.getNodeType()== JsonNodeType.OBJECT){
String jsonValue = map.toString();
System.out.println("Node Json String:"+jsonValue);
Iterator<JsonNode> iterator = map.elements();
while(iterator.hasNext()){
JsonNode node = iterator.next();
System.out.println(node.asText());
}
}
- 如何序列化对象为json字符串?
class Obj{
private String name="name";
private int age=100;
private String nullPro = null;
public String getNullPro() {
return nullPro;
}
public void setNullPro(String nullPro) {
this.nullPro = nullPro;
}
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;
}
}
----
Map<String,Object> objectMap = new HashMap<>();
objectMap.put("obj",new Obj());
objectMap.put("list",Arrays.asList(new String[]{"hello","jackson"}));
objectMap.put("string","ok");
objectMap.put("null",null);
objectMap.put("number",12e3-1);
ObjectMapper om = new ObjectMapper();
om.setSerializationInclusion(JsonInclude.Include.NON_NULL);
System.out.println(om.writer().withDefaultPrettyPrinter().writeValueAsSting(objectMap));
- 如何解析json字符串为Map对象?
String json1 = "{\"name\":\"zhang\", \"age\":200,\"map\":{\"a\":\"b\"},\"list\":[{\"a\":0,\"b\":\"100\"},{\"a\":0,\"b\":\"100\"}]}";
ObjectMapper om = new ObjectMapper();
Map<String, Object> map = om.readValue(json1, new TypeReference<Map<String, Object>>() {
});
assertTrue(map.get("name") instanceof String);
assertTrue(map.get("age") instanceof Integer);
assertTrue(map.get("map") instanceof Map);
assertTrue(map.get("list") instanceof List);
System.out.println(map);
通过 TypeReference
对象还可以将json字符串转成List<Object>
- 如何定义对象序列化的日期格式?
Map<String, Object> map = new HashMap<>();
map.put("date", new Date());
ObjectMapper om = new ObjectMapper();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String json = om.writer().with(df).withDefaultPrettyPrinter().writeValueAsString(map);
System.out.println(json);
- 通过传入一个注解对象来格式化对象输出?
abstract class MixInAnn{
@JsonIgnore
String passwd;
@JsonProperty(value = "userId")
String id;
}
class Obj {
private int id=0;
private String passwd="123456";
private String name = "name";
private int age = 100;
//... setter and getter
}
----
ObjectMapper om = new ObjectMapper();
om.addMixIn(Obj.class,MixInAnn.class);
Obj obj = new Obj();
System.out.println(om.writer().withDefaultPrettyPrinter().writeValueAsSring(obj));
通过 addMinIn
可以在不侵入原始POJO对象的情况下,格式化序列化结果
- 同一个对象在不同环境下序列化出不同的值
class Views {
public static class Normal{};
public static class Manager extends Normal{};
}
class Obj {
@JsonView(Views.Normal.class)
private int id=0;
@JsonView(Views.Manager.class)
private String passwd="123456";
@JsonView(Views.Normal.class)
private String name = "name";
@JsonView(Views.Normal.class)
private int age = 100;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
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;
}
}
---
ObjectMapper om = new ObjectMapper();
Obj obj = new Obj();
String normal = om.writer().withView(Views.Normal.class).withDefaultPrettyPrinter().writeValueAsString(obj);
String manager = om.writer().withView(Views.Manager.class).withDefaultPrettyPrinter().writeValueAsString(obj);
System.out.println(normal);
System.out.println(manager);
类比数据库的视图模式和@JsonView
,很容易理解它的使用场景
更多详细用法:
https://github.com/FasterXML/jackson-docs
https://github.com/FasterXML/jackson-docs/wiki