一、概述
1、概念
JSON:JavaScript Object Notation JavaScript对象表示法
2、基本格式
var p = {"name":"张三","age":23,"sex":"男"};
3、用途和优点
(1)json 现在多用于存储和交换文本信息的语法
(2)进行数据的传输
(3)JSON 比 XML 更小、更快,更易解析
二、语法
1、基本规则
(1)数据在名称/值对中:json 数据是由键值对构成的。
① 键用引号(单双都行)引起来,也可以不使用引号
② 值的类型:
a、数字(整数或浮点数)
b、字符串(在双引号中)
c、逻辑值(true 或 false)
d、数组(在方括号中) 如:{"persons":[{},{}]}
e、对象(在花括号中) 如: {"address":{"province":"河北"....}}
f、null :控制
(2)数据有逗号分隔:多个键值对由逗号分隔
(3)花括号保存对象:使用 {} 定义 json 格式
(4)方括号保存数据:[]
2、获取数据
(1)json对象.键名
(2)json对象["键名"]
(3)数组对象[索引]
(4)遍历对象
代码演示:
1 1 <script> 2 2 //1.定义基本格式 3 3 var person = {"name": "张三", age: 23, 'sex': true}; 4 4 5 5 var ps = [{"name": "张三", "age": 23, "sex": true}, 6 6 {"name": "李四", "age": 24, "sex": true}, 7 7 {"name": "王五", "age": 25, "sex": false}]; 8 8 9 9 1010 1111 1212 //获取person对象中所有的键和值 1313 //for in 循环 1414 /* for(var key in person){ 1515 //这样的方式获取不行,key 是字符串类型。因为相当于 person."name" 1616 //alert(key + ":" + person.key); 1717 alert(key+":"+person[key]); 1818 }*/ 1919 2020 //获取ps中的所有值 2121 for (var i = 0; i < ps.length; i++) { 2222 var p = ps[i]; 2323 for(var key in p){ 2424 alert(key+":"+p[key]); 2525 } 2626 } 2727 2828 </script>
三、JSON 数据和 Java 对象的相互转换
1、JSON 解析器
常见的解析器:Jsonlib,Gson,fastjson,jackson
2、Java 对象转换为 JSON
使用步骤:
(1)导入 Jackson 的相关 jar 包
(2)创建 Jackson 的核心对象 ObjectMapper
(3)调用 ObjectMapper 的相关方法进行转换
① 转换方法
writeValue(参数1,obj):
参数1:
-
-
-
-
-
- File:将obj对象转换为JSON字符串,并保存到指定的文件中
- Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
- OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
-
-
-
writeValueAsString(obj):将对象转为json字符串
-
② 注解
1 @JsonIgnore:排除属性。 // 加到 JavaBean 上时,便不会对该属性转化为 json 数据 2 @JsonFormat:属性值得格式化 // 多用于时间类型的成员变量上,来格式化,如@JsonFormat(pattern = "yyyy-MM-dd")
③ 复杂 java 对象转换
对于 List 和 Map 集合来说,转换成 json 数据后,会转换为一个对象数组字符串。
3、JSON 对象转为 Java 对象
步骤同上,只是调用的方法不同。
转化为 Java 对象的方法:
readValue(json字符串数据,转化为类型的Class)
代码演示:
1 1 public void test() throws Exception { 2 2 //1.初始化JSON字符串 3 3 String json = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":23}"; 4 4 5 5 //2.创建ObjectMapper对象 6 6 ObjectMapper mapper = new ObjectMapper(); 7 7 //3.转换为Java对象 Person对象 8 8 Person person = mapper.readValue(json, Person.class); 9 9 1010 System.out.println(person); 1111 }
四、检验用户是否存在案例
需求:
1、在注册页面进行验证,当用户输入用户名时,如果已经存在该用户名,提示“此用户名太受欢迎,请更换一个”;
2、如果没有用户名存在,提示"用户名可用"
代码实现:
注册页面:
1 1 <!DOCTYPE html> 2 2 <html lang="en"> 3 3 <head> 4 4 <meta charset="UTF-8"> 5 5 <title>注册页面</title> 6 6 <script src="js/jquery-3.3.1.min.js"></script> 7 7 8 8 9 9 <script> 1010 //在页面加载完成后 1111 $(function () { 1212 //给username绑定blur事件 1313 $("#username").blur(function () { 1414 //获取username文本输入框的值 1515 var username = $(this).val(); 1616 //发送ajax请求 1717 //期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"} 1818 // {"userExsit":false,"msg":"用户名可用"} 1919 $.get("findUserServlet",{username:username},function (data) { 2020 //判断userExsit键的值是否是true 2121 2222 // alert(data); 2323 var span = $("#s_username"); 2424 if(data.userExsit){ 2525 //用户名存在 2626 span.css("color","red"); 2727 span.html(data.msg); 2828 }else{ 2929 //用户名不存在 3030 span.css("color","green"); 3131 span.html(data.msg); 3232 } 3333 },"json"); // 设置返回数据为json 3434 3535 }); 3636 }); 3737 3838 </script> 3939 </head> 4040 <body> 4141 4242 4343 <form> 4444 4545 <input type="text" id="username" name="username" placeholder="请输入用户名"> 4646 <span id="s_username"></span> 4747 <br> 4848 <input type="password" name="password" placeholder="请输入密码"><br> 4949 <input type="submit" value="注册"><br> 5050 5151 </form> 5252 5353 </body> 5454 </html>
服务器端代码:
1 1 import com.fasterxml.jackson.databind.ObjectMapper; 2 2 import javax.servlet.ServletException; 3 3 import javax.servlet.annotation.WebServlet; 4 4 import javax.servlet.http.HttpServlet; 5 5 import javax.servlet.http.HttpServletRequest; 6 6 import javax.servlet.http.HttpServletResponse; 7 7 import java.io.IOException; 8 8 import java.util.HashMap; 9 9 import java.util.Map; 1010 1111 @WebServlet("/findUserServlet") 1212 public class FindUserServlet extends HttpServlet { 1313 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 1414 //1.获取用户名 1515 String username = request.getParameter("username"); 1616 1717 //2.调用service层判断用户名是否存在 1818 1919 //期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"} 2020 // {"userExsit":false,"msg":"用户名可用"} 2121 2222 //设置响应的数据格式为json 2323 response.setContentType("application/json;charset=utf-8"); 2424 Map<String,Object> map = new HashMap<String,Object>(); 2525 2626 if("jack".equals(username)){ 2727 //存在 2828 map.put("userExsit",true); 2929 map.put("msg","此用户名太受欢迎,请更换一个"); 3030 }else{ 3131 //不存在 3232 map.put("userExsit",false); 3333 map.put("msg","用户名可用"); 3434 } 3535 3636 //将map转为json,并且传递给客户端 3737 //将map转为json 3838 ObjectMapper mapper = new ObjectMapper(); 3939 //并且传递给客户端 4040 mapper.writeValue(response.getWriter(),map); 4141 4242 4343 } 4444 4545 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 4646 this.doPost(request, response); 4747 } 4848 }