Jackson
-
核心jar包
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.8</version> </dependency> //jackson-core依赖下面的两个jar包,但是不一定会使用。所以下面的两个jar包是可选的, //只要在依赖或者程序出问题时及时导入就可以了 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency>
1. 基本使用
1.1 Json —> Object
测试方法
@Test
public void jsonTest() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json2 = "{\"host\":\"testhost.com:8082\",\"value_max\":0.0}";
Json2Bean mapres = objectMapper.readValue(json2, Json2Bean.class);
System.out.println(mapres.toString());
}
javaBean
public class Json2Bean {
private String host;
private float value_max;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public float getValue_max() {
return value_max;
}
public void setValue_max(float value_max) {
this.value_max = value_max;
}
@Override
public String toString() {
return "Json2Bean{" +
"host='" + host + ''' +
", value_max=" + value_max +
'}';
}
}
试了一下,可以没有get方法,但是一定要有set方法。
Json—> Object 两步:
① 创建ObjectMapper
②将JSON字符串反序列化成Object
1.2 Object —> Json
public void jsonTest() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json2 = "{"host":\"testhost.com:8082\",\"value_max\":0.0}";
Json2Bean mapres = objectMapper.readValue(json2, Json2Bean.class);
String jsonString = objectMapper.writeValueAsString(mapres);
System.out.println(jsonString);
}
Object —> Json 两步:
① 创建ObjectMapper
②将Java对象序列化成Json
1.3 嵌套 Json 的反序列化
Json字符串如下:
{
"fullname": "Sean Kelly",
"org": "SK Consulting",
"emailaddrs": [{
"type": "work",
"value": "kelly@seankelly.biz"
},
{
"type": "home",
"pref": 1,
"value": "kelly@seankelly.tv"
}],
"telephones": [{
"type": "work",
"pref": 1,
"value": "+1 214 555 1212"
},
{
"type": "fax",
"value": "+1 214 555 1213"
},
{
"type": "mobile",
"value": "+1 214 555 1214"
}],
"addresses": [{
"type": "work",
"format": "us",
"value": "1234 Main StnSpringfield, TX 78080-1216"
},
{
"type": "home",
"format": "us",
"value": "5678 Main StnSpringfield, TX 78080-1316"
}],
"urls": [{
"type": "work",
"value": "http://seankelly.biz/"
},
{
"type": "home",
"value": "http://seankelly.tv/"
}]
}
Java Bean
public class PersonBean {
public String fullname;
public String org;
//list中的值会被序列化成一个个LinkedHashMap
public List emailaddrs;
public List telephones;
public List addresses;
public List urls;
}
测试类:
@Test
public void personTerst() throws IOException {
PersonBean personBean = mapper.readValue(new File("C:\\Desktop\\tmp\\person.json"), PersonBean.class);
List<HashMap<Object, Object>> addr =(List<HashMap<Object, Object>>) personBean.addresses;
System.out.println(addr.get(0).get("type"));
}
验证输出:
work
1.4 Tree Model
2.注解的使用
2.1 @JsonProperty
用法:
- Java对象序列化成Json时可以用@JsonProperty来指定对象的字段转换成的Json字段
public class MyValue {
@JsonProperty("cool_name")
private String name;
private int age;
public MyValue(String name, int age) {
this.name = name;
this.age = 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;
}
}
测试类:
@Test
public void jackson() throws IOException {
ObjectMapper mapper = new ObjectMapper();
MyValue tom = new MyValue("Tom", 18);
String jsonString = mapper.writeValueAsString(tom);
System.out.println(jsonString);
}
验证输出:
{"age":18,"cool_name":"Tom"}
这里的注解放在get方法效果相同。
- json反序列化成Java对象时,可以在构造方法中指定json中的字段和java字段的对应关系。详情见2.2中的代码。
2.2 @JsonCreator
指定json反序列化时使用的构造器
public class MyValue {
private String cool_name;
private int age;
@JsonCreator
public MyValue(@JsonProperty("name") String name,@JsonProperty("age") int age) {
this.cool_name = name;
this.age = age;
}
public String getName() { return cool_name; }
public void setName(String name) {
this.cool_name = name;
}
public int getAge() { return age; }
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "MyValue{" +
"cool_name='" + cool_name + '\'' +
", age=" + age +
'}';
}
}
测试类
@Test
public void jackson() throws IOException {
ObjectMapper mapper = new ObjectMapper();
MyValue value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);
System.out.println(value);
}
验证输出:
MyValue{cool_name='Bob', age=13}
2.3 @JsonIgnoreProperties
使用该注解可以在反序列化时忽略json中的注解字段,例如:
@JsonIgnoreProperties({"foo","hoo"})
public class MyValue {
private String cool_name;
private int age;
@JsonCreator
public MyValue(@JsonProperty("name") String name,@JsonProperty("age") int age) {
this.cool_name = name;
this.age = age;
}
public String getName() { return cool_name; }
public void setName(String name) {
this.cool_name = name;
}
public int getAge() { return age; }
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "MyValue{" +
"cool_name='" + cool_name + '\'' +
", age=" + age +
'}';
}
}
测试类:
@Test
public void jackson() throws IOException {
ObjectMapper mapper = new ObjectMapper();
MyValue value = mapper.readValue("{\"name\":\"Bob\", \"age\":13,\"foo\":12,\"hoo\":13}", MyValue.class);
System.out.println(value);
}
验证输出:
MyValue{cool_name='Bob', age=13}
2.4 @JsonIgnore
使用该注解可以在序列化时忽略指定的字段,例如:
@JsonIgnoreProperties({"foo","hoo"})
public class MyValue {
private String cool_name;
private int age;
@JsonIgnore
private String school;
public MyValue(String name,int age, String school) {
this.cool_name = name;
this.age = age;
this.school = school;
}
public String getName() { return cool_name; }
public void setName(String name) {
this.cool_name = name;
}
public int getAge() { return age; }
public void setAge(int age) {
this.age = age;
}
public String getSchool() { return school; }
public void setSchool(String school) { this.school = school; }
@Override
public String toString() {
return "MyValue{" +
"cool_name='" + cool_name + '\'' +
", age=" + age +
'}';
}
}
测试类:
@Test
public void jackson() throws IOException {
ObjectMapper mapper = new ObjectMapper();
MyValue Tom = new MyValue("tom",18,"QQQQ");
String json = mapper.writeValueAsString(Tom);
System.out.println(json);
}
验证输出:
{"age":18,"name":"tom"}
网友评论