Jackson
一、JSON
1、简介
JSON: JavaScript Object Notation(JavaScript 对象表示法)
JSON 是存储和交换文本信息的语法。类似 XML
JSON 比 XML 更小、更快,更易解析。
JSON可以被各种语言使用
2、语法
2.1、json主要通过键值对保存数据
2.2、内容可以是对象、数组等
2.3、正确的JSON是这样的:属性名必须用双引号包裹
var json = '{"name":"imooc"}'; // 这个是正确的JSON格式
var json = "{"name":"imooc"}"; // 这个也是正确的JSON格式
var json = '{name:"imooc"}'; // 这个是错误的JSON格式,因为属性名没有用双引号包裹
var json = "{'name':'imooc'}";//这个也是错误的JSON格式,属性名用双引号包裹,而它用了单引号
// 检验JSON格式是否正确,可以使用 JSON.parse(json); 如果是正确的JSON格式,会返回一个对象
// 否则会报错
// 如果是对象的话,属性名可以不用双引号包裹
var obj = {name:"imooc"};
var obj = {"name":"imooc"};
var obj = {'name':'imooc'};
var obj = {"name":'imooc'};
var obj = {'name':"imooc"};
// 上述写法都是正确的。一般使用第一种形式最多,有些人可能为了保证跟JSON格式的字符串保持一致性,
// 也会使用第二种形式。。最后3种形式虽然是正确的,但不建议使用,容易挨打
3、实例
<script>
//数组中有三个对象
var s=[
{"name":"TOM","age":10},
{"name":"Jam","age":18},
{"name":"Sally","age":15}
];
//一个对象
var x={"color":"yellow","num":10};
//页面输出
document.write(s[0].name)
//控制台输出
console.log(x.color,x.num);
//对象与数组,sum对象是一个数组,数组中又有三个对象
var l={
"sum":[
{"math":100},
{"chinese":99},
{"gender":"男"}
]
}
document.write(l.sum[0].math+'
')
document.write(l.sum[1].chinese)
document.write(l.sum[2].gender)
</script>
结果
TOM100 99男
for循环的写法
//一个对象
var x={"color":"yellow","num":10};
for(var k in x){
//这里要用[]把对象扩住,x.k相当于x."color"了,与x.color不一样
document.write(x[k])
}
二、Jackson解析器
一、关于Jackson解析器
1.1、常见的解析器:Jsonlib,Gson,fastjson,jackson,这些解析器都是为java语言服务的,其中Jackson是SpringMVC内置的解析器
1.2、使用Jackson解析器需要的依赖包
jackson-core-2.2.3.jar(核心jar包)
jackson-annotations-2.2.3.jar(该包提供Json注解支持)
jackson-databind-2.2.3.jar
maven引入jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.3</version>
</dependency>
二、Java转Json
这里有个问题,maven下导入的包在实例化ObjectMapper时,显示抽象接口,而使用本地jar包导入,则没有问题,应该是maven导入的包有问题,在maven项目的类头部中把导入包名修改了就可以了
//maven头部显示
import io.restassured.mapper.ObjectMapper;
//自带jar包头部显示
import com.fasterxml.jackson.databind.ObjectMapper;
类转化为JSON
主要方法
* writeValue(参数1,obj):
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
* writeValueAsString(obj):将对象转为json字符串
writeValueAsString(obj)方法
public class JackUser {
private String name;
private int age;
private String color;
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;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Jackson {
public static void main(String[] args) throws JsonProcessingException {
JackUser user=new JackUser();
user.setName("jack");
user.setAge(20);
user.setColor("blue");
ObjectMapper mapper=new ObjectMapper();
String json=mapper.writeValueAsString(user);
System.out.println(json);
}
}
//结果
{"name":"jack","age":20,"color":"blue"}
集合转化
@Test
public void test() throws JsonProcessingException {
JackUser user = new JackUser();
user.setAge(10);
user.setColor("blue");
user.setName("Jack");
List<JackUser> users = new ArrayList<>();
users.add(user);
ObjectMapper mapper=new ObjectMapper();
String jsonlist = mapper.writeValueAsString(users);
System.out.println(jsonlist);
}
//结果
[{"name":"Jack","age":10,"color":"blue"}]
两者转化出来的结果有区别,一个是对象,一个是数组
下面这个是writeValue方法
writeValue(参数1,obj)方法
@Test
public void test3() throws IOException {
JackUser user = new JackUser();
user.setAge(10);
user.setColor("blue");
user.setName("Jack");
ObjectMapper mapper=new ObjectMapper();
//使用writeValue方法写入文件
mapper.writeValue(new File("F:\js.json"),user);
}
三、JSON转Java类
实例如下(从字符串反序列化)
public static void main(String[] args) throws IOException {
//这里的转义符号
String json = "{"name":"小民","age":20,"color":"yellow"}";
/**
* ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
*/
ObjectMapper mapper = new ObjectMapper();
//此处使用字符串反序列化
JackUser user = mapper.readValue(json, JackUser.class);
System.out.println(user.getName());
System.out.println(user.getColor());
System.out.println(user.getAge());
}
//结果
小民
yellow
0
这里使用的是readValue方法,反序列化到了我们之前创建的类JackUser的对象user里,但是age属性为什么是0呢,因为Jackson提供了一些注解,我在age的属性上加了@JsonIgnore,使得属性被忽略
ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
实例二:从文件中反序列化
@Test
public void test() throws IOException {
ObjectMapper mapper=new ObjectMapper();
//文件中反序列化
JackUser user=mapper.readValue(new File("F:\js.json"),JackUser.class);
System.out.println(user.getName());
System.out.println(user.getColor());
System.out.println(user.getAge());
}
//结果
Jack
blue
0
四、注解
Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解。
@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。
@JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")。
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty("name")。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Salary {
@JsonProperty("salary")//起别名
public double num;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss a")//格式化日期
public Date date;
@JsonIgnore//忽略掉json
public String desc;
}
//序列化
public void test() throws IOException {
ObjectMapper mapper = new ObjectMapper();
//json生成器,使用utf-8,定向到标准输出流
JsonGenerator generator = mapper.createGenerator(System.out, JsonEncoding.UTF8);
generator.writeObject(new Salary(5600,new Date(),"基础薪资"));
//通过工厂创建,序列化到文件
JsonGenerator jsonGenerator = mapper.getFactory().createGenerator(new FileWriter("sal.json"));
jsonGenerator.writeObject(new Salary(5600,new Date(),"基础薪资"));
}
{"date":"2020-09-12 05:49:50 上午","salary":5600.0}
五、节点
Json可以像xml那样,通过节点树进行操作。
public void test5() throws IOException {
ObjectMapper mapper = new ObjectMapper();
//返回整个json字符串
JsonNode jsonNode = mapper.readTree(new File("sal.json"));
System.out.println(jsonNode);
//返回其中的元素
Iterator<JsonNode> elements = jsonNode.elements();
while (elements.hasNext()){
JsonNode node = elements.next();
System.out.println(node);//获取每个元素
System.out.println(node.get("salary"));//获取元素的字段
}
}