• 【JSON】


    【JSON :JavaScript 对象表示法】

    一、 概念

    JavaScript Object Notation :JavaScript 对象表示法

    • JSON 现在多用于存储和交换文本信息的语法
    • 进行数据的传输
    • JSON 比 XML 更小、更快、更易解析

    1. Java 中创建并封装对象

    Person p = new Person();
    p.setName("");
    p.setAge("");
    p.setGender("");
    
    • 1
    • 2
    • 3
    • 4

    2. 引入 JSON 创建并封装对象

    var p = {"name":"张三","age":23,"gender":"男"};
    
    • 1

    二、 语法

    1. 基本规则

    • 数据再名称/值对中,JSON 数据都是由键值对构成的
      • 键用引号(单双都行)引起来,也可以不使用引号
      • 值的取值类型:
        1. 数字(整数或浮点数)
        2. 字符串(在双引号中)
        3. 逻辑值(true 或 false)
        4. 数组(在方括号中):{"person":[{},{}]}
        5. 对象(在花括号中):{"address":{"province":"北京"......}}
        6. null
      • 数据由逗号分隔:多个键值对由逗号分隔
      • 花括号保存对象:使用 {} 定义 JSON 格式
      • 方括号保存数组:[]

    2. 获取数据

    1. JSON 对象.键名
    2. JSON 对象["键名"]
    3. 数组对象[索引]
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>JSON数据语法title>
        <script>
            // 1. 定义基本格式
            var person={"name":"张三",age:23,'gender':true};
            alert(person);
            // 获取 name 的值
            // var name=person.name;
            var name=person["name"];
            alert(name);
            // 2. 第一种嵌套格式,{} → []
            var persons={
                "persons":[
                    {"name":"张三","age":23,"gender":true},
                    {"name":"李四","age":23,"gender":true},
                    {"name":"王五","age":23,"gender":true}]};
            alert(persons);
            // 获取王五的值
            var name01=persons.persons[2].name;
            alert(name01);
            // 2. 第二种嵌套模式,[] → {}
            var ps=[{"name":"张三","age":23,"gender":true},
                {"name":"李四","age":23,"gender":true},
                {"name":"王五","age":23,"gender":true}];
            // 获取李四的值
            alert(ps);
            alert(ps[1].name);
    
            // 获取 person 对象中的所有的键和值
            // for in 循环
            for (var key in person) {
                alert(key);
                alert(key+":"+person[key]);
            }
    
            // 获取 ps 中的所有值
            for (var i = 0; i < ps.length; i++) {
                var p=ps[i];
                for (var key in p) {
                    alert(key+":"+p[key]);
                }
            }
        script>
    head>
    <body>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    三、 JSON 解析器

    为了实现 JSON 数据和 Java 对象的相互转换
    需求:将来在网络中将 JSON 当作数据的载体进行传输

    • 引出 JSON 解析器
      • 常见的解析器:Jsonlib,Gson,fastjson,jackson

    1. Java 对象转换为 JSON 对象

    • Java 对象转换为 JSON

      • 使用步骤:
        1. 导入 jackson 的相关 jar 包
        2. 创建 jackson 核心对象 ObjectMapper
        3. 调用 ObjectMapper 的相关方法进行转换
          1. 转换方法
          2. 注解
          3. 复杂 Java 对象转换
    • 导入依赖 jar 包,使用 Maven 框架

    		<dependency>
                <groupId>org.wso2.orbit.com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-annotationsartifactId>
                <version>2.11.0.wso2v1version>
            dependency>
            <dependency>
                <groupId>org.wso2.orbit.com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-coreartifactId>
                <version>2.11.0.wso2v1version>
            dependency>
            <dependency>
                <groupId>org.wso2.orbit.com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-databindartifactId>
                <version>2.11.0.wso2v1version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 创建 Person 类
    public class Person {
        private String name;
        private int age;
        private String gender;
    
        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 getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    (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 Exception {
            // 1. 创建 Person 对象
            Person p = new Person();
            p.setName("张三");
            p.setAge(23);
            p.setGender("男");
            // 2. 创建 Jackson 的核心对象 ObjectMapper
            ObjectMapper mapper=new ObjectMapper();
            // 转换方法:
            // writeValue(参数1,obj);
            //  参数1:
            //      File:将 obj 对象转换为 JSON 字符串,并保存到指定的文件中
            //      Writer:将 obj 对象转换为 JSON 字符串,并将 JSON 数据填充到字符输出流中
            //      OutputStream:将 obj 对象转换为 JSON 字符串,并将 JSON 数据填充到字节输出流中
            // writeValueAsString(obj); 将对象转为 JSON 字符串
            String json = mapper.writeValueAsString(p);
            // {"name":"张三","age":23,"gender":"男"}
            System.out.println(json);
    
            // writeValue,将数据写到 D:a.txt 文件中
            mapper.writeValue(new File("d://a.txt"),p);
            // writeValue,将数据关联到 Writer 中
            mapper.writeValue(new FileWriter("d://b.txt"),p);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    (2) 注解
    • 注解;
      1. @JsonIgnore:排除属性
      2. @JsonFormat:属性值的格式化
    public class Person {
        private String name;
        private int age;
        private String gender;
        // @JsonIgnore // 忽略该属性
        @JsonFormat(pattern = "yyyy-MM-dd")
        private Date birthday;
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        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 getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
        @Test
        public void test02() throws Exception {
            // 1. 创建 Person 对象
            Person p = new Person();
            p.setName("张三");
            p.setAge(23);
            p.setGender("男");
            p.setBirthday(new Date());
            // 2. 转换
            ObjectMapper mapper=new ObjectMapper();
            String json=mapper.writeValueAsString(p);
            System.out.println(json);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    (3) 复杂 Java 对象转换
    • 复杂 Java 对象转换
      1. List:数组
      2. Map:与对象格式一致
        @Test
        public void test03() throws Exception {
            // 1. 创建 Person 对象
            Person p01 = new Person();
            p01.setName("张三");
            p01.setAge(23);
            p01.setGender("男");
            p01.setBirthday(new Date());
            Person p02 = new Person();
            p02.setName("张三");
            p02.setAge(23);
            p02.setGender("男");
            p02.setBirthday(new Date());
            Person p03 = new Person();
            p03.setName("张三");
            p03.setAge(23);
            p03.setGender("男");
            p03.setBirthday(new Date());
            // 2. 创建 List 集合
            List<Person> persons = new ArrayList<>();
            persons.add(p01);
            persons.add(p02);
            persons.add(p03);
            // 3. 转换
            ObjectMapper mapper=new ObjectMapper();
            String json=mapper.writeValueAsString(persons);
            System.out.println(json);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
       @Test
        public void test04() throws Exception {
            // 1. 创建 Map 对象
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("name","张三");
            map.put("age",23);
            map.put("gender","男");
            // 2. 转换
            ObjectMapper mapper=new ObjectMapper();
            String json=mapper.writeValueAsString(map);
            System.out.println(json);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2. JSON 对象转换为 Java 对象

    • JSON 对象转换为 Java 对象
      • 使用步骤:
        1. 导入 jackson 的相关 jar 包
        2. 创建 jackson 核心对象 ObjectMapper
        3. 调用 ObjectMapper 的相关方法进行转换
          • readValue(JSON 字符串数据,Class)
        @Test
        public void test05() throws Exception {
            // 1. 初始化 JSON 字符串
            String json="{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";
            // 2. 创建 ObjectMapper 对象
            ObjectMapper mapper = new ObjectMapper();
            // 3. 转换为 Java 对象 Person 对象
            Person person = mapper.readValue(json, Person.class);
            System.out.println(person);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    四、 案例

    校验用户名是否存在
    当注册某个用户应用时:注册校验
    当文本输入框失去焦点后,发送 AJAX 请求,查询数据库是否存在该用户名

    1. 如果存在,则提示信息:此用户名太受欢迎,请更换一个
    2. 如果不存在,则提示信息:可用
    • 服务器响应的数据,在客户端使用时,要想当作 JSON 数据格式使用
      1. $.get(type):将最后一个参数 type 指定为 "json"
      2. 在服务器端设置 MIME 类型:response.setContentType("application/json;charset=utf-8");
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>注册页面title>
        <script src="js/jquery-3.6.1.min.js">script>
        <script>
            // 在页面加载完成后
            $(function () {
                // 给 username 绑定 blur 事件
                $("#username").blur(function () {
                    // 获取 username 文本输入框的值
                    var username=$(this).val();
                    // 发送 AJAX 请求
                    // 期望服务器响应回的数据格式:{"userExist":true,"msg":"此用户名太受欢迎,请更换一个"}
                    // {"userExist":false,"msg":"用户名可用"}
                    $.get("findUserServlet",{username:username},function (data) {
                        // 判断 userExist 键的值是否是 true
                        var span=$("#s_username");
                        if (data.userExist){
                            // 用户名存在
                            span.css("color","red");
                            span.html(data.msg);
                        }else {
                            // 用户名不存在
                            span.css("color","green");
                            span.html(data.msg);
                        }
                    },"json");
                })
            })
        script>
    head>
    <body>
    <form>
        <input type="text" id="username" name="username" placeholder="请输入用户名">
        <span id="s_username">span>
        <br/>
        <input type="password" name="password" placeholder="请输入密码">
        <input type="submit" value="注册">
    form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    @WebServlet("/findUserServlet")
    public class FindUserServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 1. 获取用户名
            String username=request.getParameter("username");
            // 2. 调用 service 层判断用户名是否存在
            // 设置响应的数据
            // JSON 数据格式
            // response.setContentType("application/json;charset=utf-8");
            response.setContentType("text/html;charset=utf-8");
            Map<String, Object> map = new HashMap<>();
            if ("Tom".equals(username)){
                // 存在
                map.put("userExist",true);
                map.put("msg","此用户名太受欢迎,请更换一个");
            }else {
                // 不存在
                map.put("userExist",false);
                map.put("msg","此用户名可用");
            }
            // 将 Map 转换为 JSON ,并且传递给客户端
            // 将 MAP 转换为 JSON
            ObjectMapper mapper = new ObjectMapper();
            // 并且传递给客户端
            mapper.writeValue(response.getWriter(),map);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    区块链与比特币学习笔记二
    Java基础面试-JDK JRE JVM
    UNIX_Linux内核结构(二)
    【编译原理】编译器前端
    开源后台管理系统 (go-vue-admin)
    Spring MVC文件上传配置
    【CSS】CSS实现水平垂直居中
    第七章 卷积神经网络——整体结构&卷积层&池化层&卷积层和池化层的实现&CNN的实现
    蓝/绿部署 VS 金丝雀部署
    mac gitee新建工程遇到的一些问题
  • 原文地址:https://blog.csdn.net/Jade_Heng_Star/article/details/127326614