10.30 Json
一、概念
1、JS对象表示法(注:json是对象,不是类)
1.1 在java中有对象表示,比如:
Person p=new Person();
p.setName=“张三”;
p.setAge=“23”;
p.setGender=“男”;
1.2 在js也想使用对象,则使用json
var p={“name”:“张三”,“age”:“23”,“gender”:“男”};
现在的json不止这些,还有了更广泛的应用
现在Json :多用于存储和交换信息的语法,类似于XML,但更小,更快,更易于解析:即 Json用来存储数据的,并用来传输
二、语法
1、基本规则:
(1)数据在名称/值对中:json数据由键值对构成
键用引号(单双都行)引起来,也可以不用引号
值的取值类型:
数字(直接写,不用引号);
字符串(在双引号中);
逻辑值(true和false);
数组(在方括号中);{“person”:[{},{}]}
Json对象(在花括号中);{“address”:{“Provice”:“陕西”,。。。}}
null值;
(2)数据用逗号分隔:对个键值对用逗号分隔
(3)花括号保存对象:使用{}定义json格式
(4)方括号保存数组:[],对象中可以有数组
<script>
//1.定义基本格式:
var person={"name":"张三","age":23,"gender":"男"};
//alert(person);
//2.嵌套格式 {}--》[]:
var person={
"persons":
[
{"name":"张三","age":23,"gender":"男"},
{"name":"李四","age":23,"gender":"男"},
{"name":"王五","age":23,"gender":"男"}
]
};
//alert(person);
//3.嵌套格式 []-->{}:
var ps=[
{"name":"张三","age":23,"gender":"男"},
{"name":"李四","age":23,"gender":"男"},
{"name":"王五","age":23,"gender":"男"}
];
alert(ps);
</script>
2.如何获取json对象的值
(1)json对象.键名(此时键的名称不用引号)
(2)json对象[“键名”](此时键的名称用引号)
(3)数组对象[索引]
(1)
var person={"name":"张三","age":23,"gender":"男"};
//var name=person.name;
var name=person["name"];
alert(name);
(2)
var person={
"persons":
[
{"name":"张三","age":23,"gender":"男"},
{"name":"李四","age":23,"gender":"男"},
{"name":"王五","age":23,"gender":"男"}
]
};
//获取数组第三个name的值,即王五
var name1=person.persons[2].name;
alert(name1);
(3)
var ps=[
{"name":"张三","age":23,"gender":"男"},
{"name":"李四","age":23,"gender":"男"},
{"name":"王五","age":23,"gender":"男"}
];
//alert(ps);
//获取李四的值
var name2=ps[1].name;
alert(name2);
3、json的遍历:
(1)
var person={"name":"张三","age":23,"gender":"男"};
//遍历获取Person中键和值:
//for...in循环
for(var key in person){
//此时得到的key为字符串的形式,所以使用person.key是不行的,相当于person."name",有引号了,需要使用person[key]
alert(key+":"+person[key]);
}
(2)
var ps=[
{"name":"张三","age":23,"gender":"男"},
{"name":"李四","age":23,"gender":"男"},
{"name":"王五","age":23,"gender":"男"}
];
//遍历获取ps中的所有值,由于是数组,所以还需要使用双层循环
for(var i=0;i<ps.length;i++){
var p=ps[i];
for(var key in p){
alert(key+":"+p[key]);
}
}
三、Json数据与Java对象的转换
Json解析器:封装好的一些类,用起来更方便
常见的json解析器:Jsonlib、Gson、fastjson、jackson
学的是jackson,会用到此解析器
1、Json转java对象
1.1.1 导入jackson 的相关jar包
1.1.2 创建jackson核心对象 ObjectMapper
1.1.3 调用ObjectMapper的相关方法进行转换
- 转换方法:
*readValue(json字符串数据,Class)
//json转换成java
@Test
public void test5() throws JsonParseException, JsonMappingException, IOException {
String json="{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";
ObjectMapper mapper=new ObjectMapper();
Person person = mapper.readValue(json, Person.class);
System.out.println(person);
}
结果:Person [name=张三, age=23, gender=男, data=null]
2、java对象转json(更常用)
2.1使用步骤:
2.1.1 导入jackson 的相关jar包
2.1.2 创建jackson核心对象 ObjectMapper
2.1.3 调用ObjectMapper的相关方法进行转换
- 转换方法:
* writeValue(参数1,参数2 obj对象):
* 参数1说明:
* File:将obj对象转换成json字符串,并保留到指定的文件中
* Writer:将obj对象转换成json字符串,并将json数据填充到字符输出流中
* OutputStream:将obj对象转换成json字符串,并将json数据填充到字节输出流中
* writeValueAsString(obj):讲对象转成json字符串
创建Person类
使用单元测试的方法进行演示
public class jsonTest {
//使用单元测试的方式进行测试
//java对象转为字符串
@Test
public void test1() throws IOException {
//1.创建Person对象
Person p=new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
//2.创建Json的核心对象 ObjectMapper
ObjectMapper mapper=new ObjectMapper();
//3.调用方法转换
/*
* 转换方法:
* writeValue(参数1,参数2 obj对象):
* 参数1说明:
* File:将obj对象转换成json字符串,并保留到指定的文件中
* Writer:将obj对象转换成json字符串,并将json数据填充到字符输出流中
* OutputStream:将obj对象转换成json字符串,并将json数据填充到字节输出流中
* writeValueAsString(obj):讲对象转成json字符串
*/
//1、结果是:{"name":"张三","age":23,"gender":"男"}
String json = mapper.writeValueAsString(p);
System.out.println(json);
//2、将数据写到D://a.txt文件中
mapper.writeValue(new File("d://a.txt"), p);
//3、将数据关联到writer中
mapper.writeValue(new FileWriter("d://a.txt"), p);
}
}
2.2 两个注解的使用
2.2.1 @JsonIgnore:排除属性
2.2.2 @JsonFormat:属性值格式化
person类中增加了日期:
private String name;
private int age;
private String gender;
private Date data;
(1)不使用注解:
public void test2() throws JsonProcessingException{
//1.创建Person对象
Person p=new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
p.setDate(new Date());
ObjectMapper mapper=new ObjectMapper();
String json = mapper.writeValueAsString(p);
System.out.println(json);
}
结果是: {"name":"张三","age":23,"gender":"男","data":1572429371605} 日期是毫秒值
(2)使用@JsonIgnore
person类中:(是在java对象类中的属性前加注解)
private String name;
private int age;
private String gender;
@JsonIgnore
private Date data;
System.out.println(json);
结果是:{"name":"张三","age":23,"gender":"男"} 把日期Date属性过滤掉了
(3)使用@JsonFormat(pattern="yyyy-MM-dd")
private String name;
private int age;
private String gender;
@JsonFormat(pattern="yyyy-MM-dd")
private Date data;
System.out.println(json);
结果是:{"name":"张三","age":23,"gender":"男","data":"2019-10-30"} 转换成了相应的格式
3、复杂java对象的转换
3.1 List :转化出来的是数组
3.2 Map:转化出来和对象格式一致
List练习:和不复杂的没区别
@Test
public void test3() throws JsonProcessingException {
//1.创建Person对象
Person p=new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
p.setDate(new Date());
Person p1=new Person();
p1.setName("李四");
p1.setAge(23);
p1.setGender("男");
p1.setDate(new Date());
Person p2=new Person();
p2.setName("李四");
p2.setAge(23);
p2.setGender("男");
p2.setDate(new Date());
List<Person> list=new ArrayList<Person>();
list.add(p);
list.add(p1);
list.add(p2);
ObjectMapper mapper=new ObjectMapper();
String json = mapper.writeValueAsString(list);
System.out.println(json);
结果:[{"name":"张三","age":23,"gender":"男","data":"2019-10-30"},{"name":"李四","age":23,"gender":"男","data":"2019-10-30"},{"name":"李四","age":23,"gender":"男","data":"2019-10-30"}]
}
Map示例:
@Test
public void test4() throws JsonProcessingException {
Map<String, Object> map=new HashMap<String,Object>();
map.put("name", "张三");
map.put("age", 23);
map.put("gender", "男");
ObjectMapper mapper=new ObjectMapper();
String json = mapper.writeValueAsString(map);
System.out.println(json);
}
结果:{"gender":"男","name":"张三","age":23}