1.1 转换方式
首先创建转换对象ObjectMappera
ObjectMapper mapper = new ObjectMapper()
该对象主要有两个转换方法
第二种方式:
mapper.writeValue(参数1,p1)
关于参数1
File:将obj对象转换为json字符串,并保存到指定的文件中
Write:将obj对象转换为json字符串,并将json填充到字符输出流中
OutputStream:将obj对象转换为json字符串,并将json填充到字节输出流中
比如:
将JSON字符串数据写入到test.txt文件中:
mapper.writeValue(new File("/Users//Desktop/test.txt"), p1)
1.2 注解使用
@JsonIgnore:排除属性
@JsonIgnore
private Date birthday
转换最终的JSON字符串中,不会有birthday键值对。
@JsonFormat:属性值格式化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday
转换结果:
{“name”:“Alex”,“age”:21,“gender”:“男”,“birthday”:“2019-03-27 06:23:33”}
1.3 复杂Java对象转换
List集合转换为JSON字符串:
ObjectMapper mapper = new ObjectMapper()
String json = mapper.writeValueAsString(list)
System.out.println(json)
输出结果:
[{“name”:“Alex”,“age”:21,“gender”:“男”,“birthday”:“2019-03-27 06:25:23”},{“name”:“Alex”,“age”:21,“gender”:“男”,“birthday”:“2019-03-27 06:25:23”},{“name”:“Alex”,“age”:21,“gender”:“男”,“birthday”:“2019-03-27 06:25:23”}]
Map集合转换为JSON字符串
public void test4() throws Exception {
Person p1 = new Person()
p1.setName("Alex")
p1.setAge(21)
p1.setGender("男")
p1.setBirthday(new Date())
// 创建JavaBean对象
Map<String, Object>map = new HashMap<String, Object>()
// map.put("name", "Alex")
// map.put("age", "1111")
// map.put("gender", "xxx")
map.put("k1", p1)
map.put("k2", p1)
map.put("k3", p1)
// 转换
ObjectMapper mapper = new ObjectMapper()
String json = mapper.writeValueAsString(map)
System.out.println(json)
}
输出结果:
{“k1”:{“name”:“Alex”,“age”:21,“gender”:“男”,“birthday”:“2019-03-27 06:30:08”},“k2”:{“name”:“Alex”,“age”:21,“gender”:“男”,“birthday”:“2019-03-27 06:30:08”},“k3”:{“name”:“Alex”,“age”:21,“gender”:“男”,“birthday”:“2019-03-27 06:30:08”}}
二、JSON ⇒ Java对象
2.1 JSON转换为Java对象
String json = "{\"name\":\"Alex\",\"age\":21,\"gender\":\"男\",\"birthday\":\"2019-03-27 06:01:54\"}"
ObjectMapper mapper = new ObjectMapper()
Person person = mapper.readValue(json, Person.class)
System.out.println(person)
2.2 JSON转换为Java集合对象
String json = "[{\"name\":\"Alex\",\"age\":21,\"gender\":\"男\",\"birthday\":\"2019-03-27 06:01:54\"}," +
" {\"name\":\"Alex\",\"age\":21,\"gender\":\"男\",\"birthday\":\"2019-03-27 06:01:54\"}," +
" {\"name\":\"Alex\",\"age\":21,\"gender\":\"男\",\"birthday\":\"2019-03-27 06:01:54\"}]\n"
ObjectMapper mapper = new ObjectMapper()
List<Person>list = mapper.readValue(json, new TypeReference<List<Person>>() {})
for (Person p : list) {
System.out.println(p)
}
输出结果:
Person{name=‘Alex’, age=21, gender=‘男’, birthday=Wed Mar 27 14:01:54 CST 2019}
Person{name=‘Alex’, age=21, gender=‘男’, birthday=Wed Mar 27 14:01:54 CST 2019}
Person{name=‘Alex’, age=21, gender=‘男’, birthday=Wed Mar 27 14:01:54 CST 2019}
jackson是java中最常用的json处理工具包之一,其他类似功能的包括gson和fastjson等。本文将简单介绍jackson的基础知识,以作为各位读者未来使用的参考。
jackson有三种处理json的方式,分别为
这种方式可以在json字符串和pojo对象之间直接进行转换。比如说我们有一个json字符串
通过这种方式我们可以直接将其转换成一个Person类的实例,其中firstName和lastName是Person类定义的两个成员变量。
这种方式类似于xml的DOM解析,在json字符串和DOM树之间进行转换,DOM树的节点是 JsonNode 类型。其优点在于以统一的方式看待json字符串中的各个部分,使用起来更灵活。
如何构建 JsonNode 的DOM树呢? JsonNode 是抽象类,需要使用 ObjectNode 和 ArrayNode 等子类。
这种方式类似于xml的SAX解析,每次处理一个事件,或者这里叫token更合适。
反序列化用的是 JsonParser ,它的使用方式和迭代器非常相似。你每次处理的都是一个token,比如说在上面这个json字符串中,包括{、firstName、dizzy、lastName、dwarf、}等6个token,通过调用 nextToken 方法可以获得下一个token。
序列化用的 JsonGenerator ,它的方法都非常直观,比如说 writeStartObject 、 writeStringField 、 writeEndObject 等,这里就不具体介绍了。
通过注解可以定制jackson的各种特性,这里只介绍最常用的几个。
这样一个firstName为"dizzy"的Person序列化后就变成了
一般情况下java变量命名采用驼峰方式,而json字符串可能采用下划线方式。解决方式为在类或者成员变量上增加以下注解
需要注意的是虽然反序列化的时候first_name会对应到firstName变量,但是序列化的时候也会输出为first_name
有时候我们希望根据json字符串中某个字段的取值反序列化成不同的子类,比如说type为1是Student,type为2是Teacher,注意Student和Teacher必须继承同一个父类Person。
如果我们希望ObjectMapper.readValue返回List<Person>或者Map<String, Person>,由于List<Person>.class和Map<String, Person>.class在java中是不合法的,需要借助于 TypeReference
Spring提供的 MappingJackson2MessageConverter 类封装了 ObjectMapper ,如果希望对 ObjectMapper 进行定制,可以自己生成一个 MappingJackson2MessageConverter 对象并注册为bean
有时候我们希望只对部分成员变量进行序列化,如果用 @JsonIgnore ,会同时影响反序列化。这个时候我们可以用 @JsonView 注解指定某个视图类的序列化结果包含该成员变量。