Skip to content

JSON

JSON的格式介绍

response.setContentType("text/html; charset=utf-8");
  • 服务器发送给浏览器

  • response.setContentType

    • text/html

    • text/plain

    • application/xml

    • text/xml

    • application/json

    • ajax

    • 参数: type: "text"

      如果前端ajax-type参数是纯文本的话,解析出来的result就是js的string格式

      javascript
      user: {
          username: "zhangsan"
      }

      如果在前端想要知道user的username的话,因为type为text,所以result为xString,那么想要拿到用户名的话,需要自己进行字符截取

      可以把ajax-type参数设置为json,那么jquery-ajax会自动地将这个纯文本转换成json对象

      所以使用时比较方便: user.username

  • 浏览器发送给服务器

    localhost:8080/s?key=value&key=value

    • application/x-www-form-urlencode

      key=value&key=value

    • 在服务器内部 request.getParameter

  • xml

xml
<... version=1.0>
<!-- xml的数据表现力是比较强的 -->
<!-- 数据是比较冗余的 -->
<root>
  <name id="..." name="...">zhangsan</name>
</root>
  • json
json
{"name": "zhangsan", "gender": "male"}
json
["zhangsan", "lisi", "abc"]

常见的网络传输使用的数据格式

  • Content-Type: application/x-www-form-urlencode

    tex
    一般会在请求体当中出现(浏览器发送给服务器的)
    username=future-weaver&password=123456
  • xml

    一般会在响应体当中出现(服务器发送给浏览器的)
    
    xml表现力比较强,具备标签属性、标签内容的能力
    
    <xml charset=utf-8>
    <username prop="red">
    zhangsan
    </username>
  • json

    一般在响应体当中出现(服务器发送给浏览器的)
    
    json表现力相对于xml较弱,但是比较轻量,适合在网络上传输
    {username: zhangsan}

JSON数据及格式

【目标】

tex
1、了解什么是JSON数据,及其作用;
2、掌握JSON数据的3种格式;

【讲解】

【1】JSON数据及作用
html
JSON(JavaScript Object Notation, JS对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
【2】JSON数据的3种格式
  • Map<String, Object>

var user = {id: 1, name: "张三", gender: "m", address: ["shanghai", "shanghai", "hangtou"]}

user.id

user.gender

  • List<Object>

[1, 2, 3, "shanghai"]

类型语法解释
对象类型{键: 值, 键: 值}代表一个对象,有多个属性名和值
取值: 对象名.键
键是字符串的类型,值是任意类型
数组/集合类型[值1, 值2, 值3]一个数组对象,里面每个元素可以是任意类型
混合类型[{键: 值}, {键: 值}, {键: 值}]
{键: [值, 值, 值]}
1. 数组中每个元素是一个对象
2. 是一个对象,某个属性值是一个数组

【小结】

tex
1、JSON:是一种轻量级的数据交换格式;
2、JSON数据作用:网络数据传输;
3、JSON数据的3种语法:
 对象类型:   {键:值,键:值}  代表一个对象,有多个属性名和值
 数组/集合类型: [值1,值2,值3]    代表一个数组对象,里面的元素可以是任意类型
 混合类型:   [{键:值,键:值}, {键:值,键:值}]或{键:[值,值,值]}  代表数组中每个元素都是对象,一个对象某个属性值是一个数组

JSON数据前端解析

【1】解析JSON对象类型

目标
  • 使用 JS 解析 JSON 对象,获取其中的属性值
步骤

1、创建一个 person 对象的 JSON 对象,属性名:firstname、lastname、age 给三个属性赋值 2、获取 person 对象中的 firstname,lastname 和 age 属性的值,并打印;

1553397355624

实现
html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>json格式</title>
</head>
<body>
<script type="text/javascript">
    // 创建一个person对象的JSON对象,属性名:firstname、lastname、age给三个属性赋值
    var person = {
        firstname: "悟空",
        lastname: "孙",
        age: 26
    };
    //输出数据
    document.write("姓:" + person.lastname + ",名:" + person.firstname + ",年龄:" + person.age + "<br/>");
</script>
</body>
</html>

【2】解析JSON数组类型

目标
  • 使用 JS 解析 JSON 数组
步骤
  1. 创建这种格式的:[value1, value2, value3]
  2. 创建一个数组,其中的 value 可以设置成任意类型的数据;
  3. 遍历数组,输出其中的每一个值;

1553936845539

实现
html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>

<script>
    //JSON数组格式
    var arr = ['hello', 1, true];
    //解析数据
    for (var i = 0; i < arr.length; i++) {
        var obj = arr[i];
        document.write(obj+"  ");

    }
</script>
</html>

【3】解析JSON混合类型

目标
  • 解析 JSON 混合类型
步骤
html
1、分别创建JSON的混合类型:
 [{键:值},{键:值},{键:值},{键:值}]
 {键:[值,值,值]}

2、解析数据:
3、打印数据;
实现

解析:[{键:值},{键:值},{键:值},{键:值}]

javascript
<script type="text/javascript">
    //1. 创建一个数组,包含三个JSON对象
    var arr = [{
        firstname: "悟空",
        lastname: "孙",
        age: 26
    }, {
        firstname: "八戒",
        lastname: "猪",
        age: 24
    }, {
        firstname: "吴京",
        lastname: "沙",
        age: 22
    }];
    //2. 每个JSON对象都有三个属性:firstname、lastname、age。给每个对象的属性赋不同的值
    for (var person of arr) {
        //3. 遍历输出每个JSON对象的属性值
        document.write("姓:" + person.lastname + ",名:" + person.firstname + ",年龄:" + person.age + "<br/>");
    }
</script>

1553937567338

解析:{键:[值,值,值]}

javascript
<script type="text/javascript">
    //一个JSON对象,有一个baobao属性,属性值是一个数组
    var person = {
        baobao: ["悟空","八戒","沙僧"]
    };
    //取对象中babao属性
    var baobao = person.baobao;
    //遍历数组
    for (var p of baobao) {
        document.write(p+"    ");
    }
</script>

1553937526355

小结

  • Map

    • person = {name: "张三", gender: "m"}
  • person.name;

  • List

    • people = ["张三", ...]
  • people[0];

JSON转换工具

JSON转换工具介绍

目标

  1. 了解 JSON 转换工具的作用;
  2. 了解常用的 JSON 转换工具;
  3. 掌握 jackson 把 Java 对象转换成 JSON 字符串的 API;

讲解

  • JSON 转换工具的作用

JSON的转换工具是通过Java封装好的一些jar工具包,直接将Java对象或集合转换成JSON格式的字符串。

  • 常用的 JSON 转换工具;
工具名称介绍
JsonlibJava类库,需要导入的jar包较多
GsonGoogle提供的一个简单的json转换工具
FastjsonAlibaba技术团队提供的一个高性能的json转换工具
Jackson开源免费的json转换工具,SpringMVC转换默认使用jackson
  • Jackson 把 Java 对象转换成 JSON 字符串的 API;
方法名作用
new ObjectMapper()创建ObjectMapper对象
String writeValueAsString(Object obj)把对象转换为JSON字符串
T readValue(String content, Class<T> valueType)把JSON字符串转换成对象
@JsonIgnore注解【了解】转换时,@JsonIgnore所标注的属性不参与转换
  • 对象转换成 json 字符串

    java
    CheckEmailResponse result = ...;
    
    ObjectMapper mapper = new ObjectMapper();
    String jsonString = mapper.writeValueAsString(result);
  • json 字符串转换成对象

    java
    ObjectMapper mapper = new ObjectMapper();
    
    CheckEmailResult result = mapper.readValue("{...}", CheckEmailResult.class);

Jackson应用

目标

  • 使用 Jackson 把 Java 对象转换成 JSON 字符串

步骤

  1. 导入下面的三个 jar 包,复制到 WEB-INF\lib 目录下

    • jackson-annotations-2.9.0.jar
    • jackson-core-2.9.9.jar
    • jackson-databind-2.9.9.jar
  2. 创建一个 User 类:包含 id,username,age 三个属性

  3. 在 main 函数中,实例化 User 对象,给属性赋值

  4. 创建一个字符串数组对象,包含三个字符串

  5. 创建一个List<User>,包含三个用户对象

  6. 创建一个Map对象,键名为:user,键为 User 对象

  7. 实例化 ObjectMapper 对象,调用 writeValueAsString()方法输出转换后的字符串对象

实现

  • User.java
java
package com.futureweaver.entity;

public class User {

    private int id;
    private String username;
    private int age;

    public User(int id, String username, int age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                '}';
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • JacksonTest.java
java
package com.heima.json;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.heima.bean.User;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JacksonTest {
    public static void main(String[] args) throws JsonProcessingException {
        //创建User对象
        User user = new User(100,"张三", 25);
        //创建对象
        ObjectMapper mapper = new ObjectMapper();
        //调用方法
        String userJson = mapper.writeValueAsString(user);
        System.out.println("userJson = " + userJson);


        //创建一个字符串的数组
        String[] names = {"张三","李四","王五"};
        String arrJson = mapper.writeValueAsString(names);
        System.out.println("arrJson = " + arrJson);

        //创建一个List集合
        List<User> users = new ArrayList<>();
        users.add(new User(1,"孙悟空", 25));
        users.add(new User(2,"猪八戒", 23));
        users.add(new User(3,"白骨精", 20));
        String usersJson = mapper.writeValueAsString(users);
        System.out.println("usersJson = " + usersJson);

        //创建一个Map对象
        Map<String, User> map = new HashMap<>();
        map.put("user", new User(1,"孙悟空", 25));
        String mapJson = mapper.writeValueAsString(map);
        System.out.println("mapJson = " + mapJson);

    }
}

1553220609048

小结

  • 新建 ObjectMapper 对象->mapper
  • String mapper.writeValueAsString(Object javabean);
  • T readValue("json 字符串", T<类名.class>)
  • @JsonIgnore

不参与转换(不管是从字符串转换到对象也好,还是从对象转换到字符串也好,都不参与)

综合案例

新增通讯录页面email校验

【需求】

  1. 对添加通讯录页面中的 email 进行异步校验;
  2. email 存在,给出"无法注册,请重试"的提示信息;
  3. email 不存在,给出绿色"可以注册"的提示信息;

【JSP 页面】add.jsp

html
<script>
    //给姓名添加异步校验
    //事件:blur
    $(function() {
        // 当HTML全部准备好之后
        // 绑定email的离焦事件
        $("#email").blur(function() {
            // 把email的值,提交给Servlet,由Servlet进行判断
            var value = this.value;

            $.post({
                url: "check_email",
                data: {email: value},
                dataType: "json",
                success: function(result) {
                    // 当Servlet响应时,result就是响应
                    $("#checkMsg").text(result.msg);
                }
            });
        });
    });
</script>
  • CheckEmailServlet.java
java
package com.futureweaver.web;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

// 检查Email是否已经存在
@WebServlet("/check_email")
public class CheckEmailServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置编码
        request.setCharacterEncoding("utf-8");
        response.setContentType("application/json; charset=utf-8");

        // 接收数据
        // 获取参数
        String email = request.getParameter("email");

        // 字符输出流
        PrintWriter out = response.getWriter();

        // 新建一个响应的对象
        Map<String, Object> result = new HashMap<>();

        // 处理数据
        if ("future-weaver@future-weaver.com".equals(email)) {
            // 无法注册,请重试
            // 响应数据
            result.put("msg", "无法注册,请重试");
        } else {
            // 可以注册
            // 响应数据
            result.put("msg", "可以注册");
        }

        // 将对象转换成JSONString
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writeValueAsString(result);
        out.write(jsonString);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

学习目标总结

  • 能够掌握 json 的三种数据格式
  • 能够使用 json 转换工具 Jackson 进行 json 格式字符串的转换
  • 了解 Servlet 响应 Content-Type 指定为 json 格式