概念
JavaScript Object Notation,JavaScript对象表示法
用于存储和交换文本信息的语法,进行数据的传输。
类似于XML,比XML更小、更快、更易解析。
//这就是一个JSON
var p = {"name":"zs","age":18,"gender":"男"}
语法
1. 基本规则
- 数据在键值对中:JSON数据是由键值对构成
- 键可以用双引号、单引号、也可以不用引号
- 值的取值类型
- 数字:整数、浮点数
- 字符串:双引号引起来
- 逻辑值:true、false
- 数组:方括号括起来
- 对象:花括号括起来,可以是JSON对象,对象中可以包含数组,数组中可以包含对象,可以相互嵌套
- null
- 键值对由逗号分隔
- 花括号保存对象
- 方括号保存数组
2. 获取数据
- json对象.键名
- json对象["键名"]
- 数组对象[索引]
//语法
var person = {"name":"zs","age":18,"gender":"男"};
var persons={
"persons":[
{"name":"zs","age":18,"gender":"男"},
{"name":"ls","age":19,"gender":"男"},
{"name":"ww","age":17,"gender":"男"}
]
};
var ps = [
{"name":"zs","age":18,"gender":"男"},
{"name":"ls","age":19,"gender":"男"},
{"name":"ww","age":17,"gender":"男"}
];
//获取ww的name值
var namew = persons.persons[2].name;
3. 遍历
var person = {"name":"zs","age":18,"gender":"男"};
//获取person对象中所有的键值
for (var key in person){
alert(key+":"+person[key]);//这里的key是一个字符串
}
var ps = [
{"name":"zs","age":18,"gender":"男"},
{"name":"ls","age":19,"gender":"男"},
{"name":"ww","age":17,"gender":"男"}
];
//获取ps中的所有对象的所有键值
for (var i = 0; i < ps.length; i++){
var p = ps[i];
for (var key in p){
alert(key+":"+p[key]);//这里的key是一个字符串
}
}
JSON数据和java对象的相互转换
解析器
JSON常见解析器:Jsonlib、Gson、fastjson、jackson
这里先学习jackson,是SpringMVC内置的解析器
使用步骤
- 导入jar包
- 创建Jackson核心对象ObjectMapper
- 电泳ObjectMapper的相关方法进行转换
1. java对象转换JSON
//首先创建一个实体类,并生成getter、setter、toString方法
public class Person {
private String name;
private int age;
private String gender;
}
//java对象转换为JSON字符串
@Test //可以使用单元测试
public void test1() throws JsonProcessingException {//抛出异常
//1.创建Person对象
Person person = new Person();
person.setName("张三");
person.setAge(18);
person.setGender("男");
//2.创建Jackson的核心对象ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
//3.转换
String json = objectMapper.writeValueAsString(person);
System.out.println(json);//打印出 {"name":"张三","age":18,"gender":"男"}
转换方法
-
writeValue(参数1,参数2)
1. 参数1:
- File:将object对象转换为JSON字符串,并保存到指定文件中
- Writer:将object对象转换为JSON字符串,并将json数据填充到字符输出流中
- OutputStream:将object对象转换为JSON字符串,并将json数据填充到字节输出流中
2. 参数2:一个object对象 -
weiteValueAsString(object)
:将对象转换为json字符串
注解
//为实体类增加一条日期属性,并生成getter、setter、toString方法
public class Person {
private String name;
private int age;
private String gender;
private Date createTime;
}
@Test
public void test2() throws JsonProcessingException {
//1.创建Person对象
Person person = new Person();
person.setName("张三");
person.setAge(18);
person.setGender("男");
person.setCreateTime(new Date());
//2.创建Jackson的核心对象ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
//3.转换
String json = objectMapper.writeValueAsString(person);
System.out.println(json);
//打印出 {"name":"张三","age":18,"gender":"男","createTime":1589214091828}
//这里的日期属性单位为毫秒,两种选择,1.不打印该属性 2.格式化该属性
}
@JsonIgnore//忽略该属性,转换成json字符串时,就不会出现该属性
@JsonFormat(pattern = "yyyy-MM-dd")//格式化属性
//这两个注解放在实体类的createTime属性上或其getter方法上面
复杂java对象转换
- List:转换完成后是一个数组
- Map:与对象格式一致
2. JSON转换java对象
//JSON转换为java对象
@Test
public void test3() throws JsonProcessingException {
//1.初始化JSON字符串
String json = "{"name":"张三","age":18,"gender":"男"}";//转义字符
//2.创建ObjectMapper对象
ObjectMapper objectMapper = new ObjectMapper();
//3.转换为java对象
Person person = objectMapper.readValue(json,Person.class);//(json字符串,java类型)
System.out.println(person);
//打印出 Person{name='张三', age=18, gender='男', createTime=null} 没有赋crateTime值
}