【JSON :JavaScript 对象表示法】

本文详细介绍了JSON的概念、语法及其在数据传输中的作用,包括如何在JavaScript中创建和封装JSON对象。此外,文章还深入讲解了JSON解析器,特别是Jackson库在Java对象与JSON之间的转换方法,如注解的使用、复杂对象的转换等。最后,通过一个案例展示了JSON在AJAX请求中的应用,用于校验用户名是否存在。
摘要由CSDN通过智能技术生成

【JSON :JavaScript 对象表示法】

一、 概念

JavaScript Object Notation :JavaScript 对象表示法

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

1. Java 中创建并封装对象

Person p = new Person();
p.setName("");
p.setAge("");
p.setGender("");

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

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

二、 语法

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>

三、 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.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.0.wso2v1</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.orbit.com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.11.0.wso2v1</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.orbit.com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.0.wso2v1</version>
        </dependency>
  • 创建 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) 转换方法
  • 转换方法:
    • 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);
    }
}
(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 + '\'' +
                '}';
    }
}
    @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);
    }
(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);
    }
   @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);
    }

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);
    }

四、 案例

校验用户名是否存在
当注册某个用户应用时:注册校验
当文本输入框失去焦点后,发送 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>
@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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值