# JSON:
1. 概念: JavaScript Object Notation 用json来表示对象就是JavaScript对象表示法
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
json就类似到Person对象封装了name age gender这些零散的数据,用对象来当参数来传递这些零散的数据,用到了js中: var p = {"name":"张三","age":23,"gender":"男"};
* json现在多用于存储和交换文本信息的语法
* 进行数据的传输
* JSON 比 XML 更小、更快,更易解析。
2. 语法:
1. 基本规则
* 数据在名称/值对中:json数据是由键值对构成的
* 键用引号(单双都行)引起来,也可以不使用引号
* 值得取值类型:
1. 数字(整数或浮点数)
2. 字符串(在双引号中)
3. 逻辑值(true 或 false)
4. 数组(在方括号中) {"persons":[{},{}]}
5. 对象(在花括号中) {"address":{"province":"陕西"....}}
6. null
* 数据由逗号分隔:多个键值对由逗号分隔
* 花括号保存对象:使用{}定义json 格式
* 方括号保存数组:[ ]注意这句话 花括号里保存对象 中括号里保存数组
var persons={"inpersons":[{"name":"张三","gender":true,"age":23},{"name":"tt","gender":true,"age":23},{"name":"yy","gender":true,"age":23}]};
//persons是对象名称 inpersons是键的名称 值对应的是一个数组<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> //1.定义一个基本格式 一个对象 var person={"name":"张三","gender":true,"age":23}; //大括号 alert(person); //2.嵌套格式 大括号嵌入中括号 多个对象 嵌套格式 大括号嵌入中括号 其实就是键" " :对应的值是一个数组[{},{}] var persons={"inpersons":[{"name":"张三","gender":true,"age":23},{"name":"tt","gender":true,"age":23},{"name":"yy","gender":true,"age":23}]}; //person是对象名称 inpersons是键的名称 值对应的是一个数组 alert(persons); //3.嵌套格式 中括号里面嵌入大括号 一个数组里面放多个对象 var ps=[{"name":"张三","gender":true,"age":23},{"name":"tt","gender":true,"age":23},{"name":"yy","gender":true,"age":23}] alert(ps) ; </script> </head> <body> </body> </html>
注意这里弹出:
2. 获取数据: 4种
1. json对象.键名
2. json对象["键名"] -------键名加引号
3. 数组对象[索引]-------------数组可以用index获取获取json数据:
<script> //三种方法定义了三个json //1.定义一个基本格式 var person={"name":"张三","gender":true,"age":23}; //大括号 //获取name的值 var name = person.name; var name01 = person["name"]; //两种获取方式都可以 alert(name); alert(name01); //2.嵌套格式 大括号嵌入中括号 其实就是键" " :对应的值是一个数组[{},{}] var persons={"inpersons":[{"name":"张三","gender":true,"age":23},{"name":"tt","gender":true,"age":23},{"name":"yy","gender":true,"age":23}]}; //获取tt 首先考虑persons是一个json对象 里面的inpersons对应的是一个数组有index索引 var name02 = persons.inpersons[1].name; //persons是对象名称 inpersons是键的名称 值对应的是一个数组 json对象.数组对象[索引].键名 alert(name02); //3.嵌套格式 中括号里面嵌入大括号 一个数组里面放多个对象 var ps=[{"name":"张三","gender":true,"age":23},{"name":"tt","gender":true,"age":23},{"name":"yy","gender":true,"age":23}] alert(ps[2].name); </script>
4. json遍历<script> var person={"name":"张三","gender":true,"age":23}; //大括号 var ps=[{"name":"张三","gender":true,"age":23},{"name":"tt","gender":true,"age":23},{"name":"yy","gender":true,"age":23}]; var persons={"inpersons":[{"name":"张三","gender":true,"age":23},{"name":"tt","gender":true,"age":23},{"name":"yy","gender":true,"age":23}]}; //获取person对象种所有的键和值 //用for in循环 for (var key in person){ //alert(key); //得到的是弹出字符串格式的name gender age // alert(key+":"+person.key); //这里的key是字符串格式所以person.key相当于person."key"形式是不对的 alert(key+":"+person[key]) ; //这种方式就是为了遍历使用的 person[key] 因为正常格式是 对象[" "]; } //获取ps中的所有值 ps是一个数组 for (var i = 0; i <ps.length ; i++) { var p = ps[i]; for (var key in p){ alert(key+"::"+p[key]) ; } //获取persons的所有值 for (var j = 0; j < persons.inpersons.length; j++) { var inperson = persons.inpersons[j]; for (var key in inperson) { alert(key+":"+inperson[key]) ; } } } </script>
3. JSON数据和Java对象的相互转换 其实json可以转为任意对象 其实java也可以转换为json传递给客户端去使用:
为什么要转换?因为之后要把json当作数据的载体在网咯种进行传输 涉及客户端和服务器端 客户端和服务器端进行通讯时候可以用json作为一个载体
json<==>java
* JSON解析器: 就是封装好的工具类
* 常见的解析器:Jsonlib,Gson,fastjson,jackson(Spring内置)
1. JSON转为Java对象
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
3. 调用ObjectMapper的相关方法进行转换
1. readValue(json字符串数据,Class)@Test//json字符串转为java对象 public void test05() throws IOException { /* 1. 导入jackson的相关jar包 2. 创建Jackson核心对象 ObjectMapper 3. 调用ObjectMapper的相关方法进行转换 1. readValue(json字符串数据,Class)*/ //1.初始化json字符串 String json = "{\"name\":\"tt\",\"age\":23,\"gender\":\"男\"}";//json中要写person对象中有的变量 //2.创建ObjectMapper对象 ObjectMapper mapper = new ObjectMapper(); Person person = mapper.readValue(json, Person.class); System.out.println(person); //注意这里是json对象转化为person所以json的键值对要注意怎么写 要写person对象中有的变量 //输出 cn.itcast.domain.Person@3444d69d 说明json对象已经转为person对象了 }
2. Java对象转换JSON----更为常用一些 在服务器端的数据给客户端去
1. 使用步骤:
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
3. 调用ObjectMapper的相关方法进行转换
1. 转换方法:
* writeValue(参数1,obj):
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
* writeValueAsString(obj):将对象转为json字符串public class JacksonTest { //java对象转为json @Test public void test01() throws IOException { /* 1. 导入jackson的相关jar包 2. 创建Jackson核心对象 ObjectMapper 3. 调用ObjectMapper的相关方法进行转换*/ //1.创建Person对象 Person p1 = new Person("张三", 23, "男"); //2.创建json的核心对象 ObjectMapper ObjectMapper mapper = new ObjectMapper(); //3.调用转换方法 /* * writeValue(参数1,obj): 参数2 obj是一个obj对象 参数1:参数一的参数形式有三种writeValue(File,obj);writeValue(Writer,obj);writeValue( OutputStream,obj); File:将obj对象转换为JSON字符串,并保存到指定的文件中 Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中 OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中 * writeValueAsString(obj):将对象转为json字符串 */ //writeValueAsString(obj): String json = mapper.writeValueAsString(p1); //期望的打印结果{"name":"张三","age":23,"gender":"男"} System.out.println(json);//{"name":"张三","age":23,"gender":"男"} //writeValue(参数1,obj): mapper.writeValue(new File("D:\\a.txt"),p1); mapper.writeValue(new FileWriter("D:\\b.txt"),p1); mapper.writeValue(new FileOutputStream("D:\\c.txt"),p1); } }
2. 注解:
1. @JsonIgnore:排除属性。
2. @JsonFormat:属性值得格式化
* @JsonFormat(pattern = "yyyy-MM-dd")
@Test public void test02() throws JsonProcessingException { Person p1 = new Person(); p1.setName("tt"); p1.setAge(23); p1.setGender("男"); p1.setBirthday(new Date()); //2.转换 ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p1); //不转换或者忽略的话date输出的是毫秒值{"name":"张三","age":23,"gender":"男","birthday":1652694882457} System.out.println(json); }
控制台打印输出: {"name":"tt","age":23,"gender":"男","birthday":"2022-05-16"}
3. 复杂java对象转换 list和map的转换
1. List:数组
2. Map:对象格式一致@Test public void test03() throws JsonProcessingException { Person p2 = new Person(); p2.setName("tt"); p2.setAge(23); p2.setGender("男"); p2.setBirthday(new Date()); Person p3 = new Person(); p3.setName("uu"); p3.setAge(20); p3.setGender("男"); p3.setBirthday(new Date()); Person p4 = new Person(); p4.setName("yy"); p4.setAge(23); p4.setGender("女"); p4.setBirthday(new Date()); //创建list集合 List<Person> list = new ArrayList<>(); list.add(p2); list.add(p3); list.add(p4); //转换 ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(list); System.out.println(json); /*[{"name":"tt","age":23,"gender":"男","birthday":"2022-05-16"}, {"name":"uu","age":20,"gender":"男","birthday":"2022-05-16"}, {"name":"yy","age":23,"gender":"女","birthday":"2022-05-16"}] [{},{},{}] 数组格式*/ } @Test public void test04() throws JsonProcessingException { HashMap<String,Object> map = new HashMap<>(); map.put("tt",23); map.put("yy",20); map.put("gender","男"); map.put("姓名","tt"); //转换 ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(map); System.out.println(json);//{"tt":23,"yy":20,"姓名":"tt","gender":"男"}注意都是键值对形式的 } }
# 案例:
* 校验用户名是否存在
1. 服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
1. $.get(type):将最后一个参数type指定为"json"
2. 在服务器端设置MIME类型
response.setContentType("application/json;charset=utf-8");