Day08-Json补充

JSON

一. JSON

1 JSON回顾

JavaScript对象文本表示形式(JavaScript Object Notation : js对象简称)

【1】json在js中是一个对象,在java中是字符串

【2】json是目前 前后端数据交互的主要格式之一

【3】json是一种特殊的 js 对象

#json的语法主要有两种:
        1. 对象 { }
        2. 数组 [ ]
        
1. 对象类型
		{name:value,name:value}
		
2. 数组类型
		[
            {name:value,name:value}, 
            {name:value,name:value},
            {name:value,name:value}
		]
		
3. 复杂对象
		{
            name:value,
            wives:[{name:value},{},{}],
            son:{name:value}
		}
#注意: 
	1. 其中name必须是string类型
		json在js中,name的双引号可以省略
	2. value必须是以下数据类型之一:
		字符串
		数字
		对象(JSON 对象)
		数组
		布尔
		Null
	3. JSON 中的字符串必须用双引号包围。(单引号不行!)	

二. Fastjson

1 fastjson引入

需求

​ 在服务器端有如下User对象需要响应给浏览器.

​ 为了方便浏览器解析, 这就要求服务端在响应之前,需要将转成符合Json格式的字符串.

image-20211206192620019

package com.itheima02.json;

public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
    //TODO: 自己采用字符串拼接的方式输出。
    public String toJson() {
        return "{\"username\":\""+username+"\",\"password\":"+password+"}";
    }
    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

​ 通过拼接字符串的形式,将java对象转换成json格式字符串无疑是非常麻烦的,在开发中我们一般使用转换工具来达到实现.

​ 所谓的转换工具是通过java封装好的一些jar工具包,可以直接将java对象或集合转换成json格式的字符串。

常见的json转换工具

1553220531567

其实这些工具使用起来都差不多, 目前我们学习使用的是Fastjson

2 fastjson 常用 API

fastjson 作用:

  1. 将java对象转成json字符串==》响应给前端
  2. 将json字符串 转成 java对象===》接收前端的json数据封装到对象中

常用API

fastjson API 入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

public static final String toJSONString(Object object); // 将java中任意对象序列化为JSON文字符串

//下面的两个方法是将页面获取json数据封装到实体类对象中

public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON字符串text解析成指定类型JavaBean 

public static final <T> T parseObject(InputStream is, Class<T> clazz); // 将从页面获取的字节输入流中的字符数据解析成指定类型JavaBean 
 举例:User user = JSON.parseObject(request.getInputStream(), User.class);
 注意:
     1)request.getInputStream():表示获取关联浏览器的字节输入流
     2)使用parseObject方法将前端接收的json数据转换为对应实体类对象,要求前端传递的json数据的key必须和实体类对象的成员变量名一致
     举例:
     	{"username":"张子枫","password":1234} 来自于前端浏览器
     实体类:
     	class User{
            private String username;//这里的成员变量必须前端提交json格式的数据的key一致,必须是username
            private String password;
        }
     

3 fastjson 使用实例

1 导包

  <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

2 实体类

package com.itheima02.json;

public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
    //TODO: 自己采用字符串拼接的方式输出。
    public String toJson() {
        return "{\"username\":\""+username+"\",\"password\":"+password+"}";
    }
    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3 测试

/*
    TODO 需求:
        java对象或集合 转换成 json格式字符串
        json格式字符串 转换成 java对象或集合
 */
package com.itheima.test;

import com.alibaba.fastjson.JSON;
import com.itheima02.json.User;
import org.junit.Test;

import java.util.ArrayList;

/*
    TODO 需求:
        java对象或集合 转换成 json格式字符串
        json格式字符串 转换成 java对象或集合
 */
public class JsonDemo {

    @Test
    public void method01(){
        User user = new User("zs", "123");
        System.out.println(user.toJson());
    }

    @Test
    public void method02(){
        //java对象转json格式字符串
        User user = new User("ls", "123");
        //{"password":"123","username":"ls"}
        String s = JSON.toJSONString(user);
        System.out.println(s);
    }

    @Test
    public void method03(){
        //java集合转json格式字符串
        User user1 = new User("ls", "123");
        User user2 = new User("ww", "110");

        ArrayList<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        //[{"password":"123","username":"ls"},{"password":"110","username":"ww"}]
        String s = JSON.toJSONString(list);
        System.out.println(s);
    }

    @Test
    public void method04(){
        //json格式字符串转java对象
        String json = "{\"password\":\"123\",\"username\":\"ls\"}";
        /*
            ORM: object relationship mapping 对象关系映射
            1. 体现: 一条数据映射成一个java对象
            2. 原理: 反射
                1). 首先解析json字符串,变成map
                2). 然后遍历map
                        key 对应 value
                        username  ls   <-
                        password  123
                3). 反射操作对象
                    // User类的Class对象
                    Class clazz = User.class;
                    // 使用User类的空参构造创建实例
                    User user = clazz.newInstance();
                    //获取类中方法
                   // 方法名的推断: set + map中的key
                   Method method = clazz.getMethod("setUsername",String.class);
                   //调用方法 user.setUsername("ls");
                   method.invoke(user,"ls")
         */
        //User{username='ls', password='123'}
        User user = JSON.parseObject(json, User.class);
        System.out.println(user);
    }

}

三. ajax和json综合 (特别重要!!!)

1 请求参数和响应数据都是普通字符串

<template>
  <div>
        <h1>axios和json综合</h1>
        <input type="button" value="请求和响应都是普通字符串" @click="method01()"> <br>
        <input type="button" value="响应数据改成json字符串" @click="method02()"> <br>
        <input type="button" value="请求数据也改成json字符串" @click="method03()"> <br>
        <hr>
        <h3>好友列表</h3>
        <div id="messageDiv"></div>
        <table width="500px" cellspacing="0px" cellpadding="5px" border="1px" id="myTable">
            <tr>
                <th>id</th>
                <th>name</th>
                <th>age</th>
            </tr>
            <!-- <tr>
                <td></td>
                <td></td>
                <td></td>
            </tr>-->
        </table>
  </div>
       
</template>

<script>
import axios from 'axios'
export default {
  methods: {
    //1.请求和响应都是普通字符串
    method01(){
        let url = "/Union01Servlet";
        let param = "username=admin&password=123";

        // axios.get(url+"?"+param)

        axios.post(url,param).then(response=>{
            console.log(response.data);
        }).catch(error=>{
            console.log(error);
        }).finally(()=>{
            console.log("无论如何都执行");
        })
    }
  }
}
</script>

<style>

</style>

package com.itheima04.union;

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;

@WebServlet("/Union01Servlet")
public class Union01Servlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取请求
            //解决post请求乱码问题
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        System.out.println(username + "," + password);

        //2. 业务处理

        //3. 响应数据
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("响应数据");

    }

}

2 响应数据改成json格式

需求:查询当前用户的好友 List list,转成json格式字符串,最后响应

【1】html页面

<template>
  <div>
        <h1>axios和json综合</h1>
        <input type="button" value="请求和响应都是普通字符串" @click="method01()"> <br>
        <input type="button" value="响应数据改成json字符串" @click="method02()"> <br>
        <input type="button" value="请求数据也改成json字符串" @click="method03()"> <br>
        <hr>
        <h3>好友列表</h3>
        <div id="messageDiv"></div>
        <table width="500px" cellspacing="0px" cellpadding="5px" border="1px" id="myTable">
            <tr>
                <th>id</th>
                <th>name</th>
                <th>age</th>
            </tr>
            <!-- <tr>
                <td></td>
                <td></td>
                <td></td>
            </tr>-->
        </table>
  </div>
       
</template>

<script>
import axios from 'axios'
export default {
  methods: {
    //1.请求和响应都是普通字符串
    method01(){
        let url = "/Union01Servlet"
        let param = "username=admin&password=123"

        // axios.get(url+"?"+param)

        axios.post(url,param).then(response=>{
            console.log(response.data);
        }).catch(error=>{
            console.log(error);
        }).finally(()=>{
            console.log("无论如何都执行");
        })
    },
    method02(){
         let url = "/Union02Servlet"
         let param = "username=admin&password=123"

        axios.post(url,param).then(response=>{
            console.log(response.data);
            var messageDiv = document.getElementById("messageDiv");
            var myTable = document.getElementById("myTable");
            if(response.data.flag){
                //请求成功
                messageDiv.innerHTML = response.data.message
                let content = ""
                for(let i=0;i<response.data.valueData.length;i++) {
                    let friend = response.data.valueData[i];
                    content += `<tr>
                                    <td>${friend.id}</td>
                                    <td>${friend.name}</td>
                                    <td>${friend.age}</td>
                                </tr>`;
                }

                    myTable.innerHTML += content
                }else{
                    //请求失败
                    messageDiv.innerHTML = response.data.message
                }
            })
    }

  }
}
</script>

<style>

</style>

【2】Friend类

package com.itheima04.union.po;

import java.io.Serializable;

public class Friend implements Serializable {

    private String id;
    private String name;
    private Integer age;

    public Friend() {
    }

    public Friend(String id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

【3】Servlet

服务器响应json格式的MIME类型:"application/json"

package com.itheima03.union;

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Friend;
import com.itheima.pojo.Result;

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.util.ArrayList;
import java.util.Collections;

@WebServlet("/Union02Servlet")
public class Union02Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //1. 获取请求
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //2. 业务处理

//            int i = 1/0; // 模拟数据库崩溃
            //查询当前用户的好友 List<Friend> list,转成json格式字符串,最后响应
            //用伪数据代替
            Friend f1 = new Friend("1001", "张三", 18);
            Friend f2 = new Friend("1002", "李四", 19);
            Friend f3 = new Friend("1003", "王五", 20);
            ArrayList<Friend> list = new ArrayList<>();
            Collections.addAll(list,f1,f2,f3);

            //3. 响应数据
//        response.setContentType("text/html;charset=utf-8");
            response.setContentType("application/json;charset=utf-8");

            Result result = new Result(true, "获取好友列表成功", list);
            //fastjson等工具实现 (java对象或集合 转成 json格式字符串)
            String json = JSON.toJSONString(result);
            response.getWriter().print(json);
        } catch (Exception e) {
            response.setContentType("application/json;charset=utf-8");
            Result result = new Result(false, "获取好友列表失败");
            //fastjson等工具实现 (java对象或集合 转成 json格式字符串)
            String json = JSON.toJSONString(result);
            response.getWriter().print(json);
        }
    }
}

【4】响应结果的封装Result类

说明:如果响应失败,上述代码并没有考虑,所以为了代码严谨性,我们需要单独在抽取一个实体类,避免失败情况发生的处理方案

 	private boolean flag;//执行结果,true为执行成功 false为执行失败
    private String message;//返回结果信息
    private Object valueData;//返回数据(如果是查询操作则设置,如果是增删改则不设置)
package com.itheima.sh.a_json_01;

public class Result {
    private boolean flag;//执行结果,true为执行成功 false为执行失败
    private String message;//返回结果信息
    private Object valueData;//返回数据(如果是查询操作则设置,如果是增删改则不设置)

    public Result() {
    }
    //失败,或者增删改
    public Result(boolean flag, String message){
        this.flag = flag;
        this.message = message;
    }
    //成功的查询


    public Result(boolean flag, String message, Object valueData) {
        this.flag = flag;
        this.message = message;
        this.valueData = valueData;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getValueData() {
        return valueData;
    }

    public void setValueData(Object valueData) {
        this.valueData = valueData;
    }
}

3 请求参数改成json格式

<template>
  <div>
        <h1>axios和json综合</h1>
        <input type="button" value="请求和响应都是普通字符串" @click="method01()"> <br>
        <input type="button" value="响应数据改成json字符串" @click="method02()"> <br>
        <input type="button" value="请求数据也改成json字符串" @click="method03()"> <br>
        <hr>
        <h3>好友列表</h3>
        <div id="messageDiv"></div>
        <table width="500px" cellspacing="0px" cellpadding="5px" border="1px" id="myTable">
            <tr>
                <th>id</th>
                <th>name</th>
                <th>age</th>
            </tr>
            <!-- <tr>
                <td></td>
                <td></td>
                <td></td>
            </tr>-->
        </table>
  </div>
       
</template>

<script>
import axios from 'axios'
export default {
  methods: {
    //1.请求和响应都是普通字符串
    method01(){
        let url = "/Union01Servlet"
        let param = "username=admin&password=123"

        // axios.get(url+"?"+param)

        axios.post(url,param).then(response=>{
            console.log(response.data);
        }).catch(error=>{
            console.log(error);
        }).finally(()=>{
            console.log("无论如何都执行");
        })
    },
    method02(){
         let url = "/Union02Servlet"
         let param = "username=admin&password=123"

        axios.post(url,param).then(response=>{
            console.log(response.data);
            var messageDiv = document.getElementById("messageDiv");
            var myTable = document.getElementById("myTable");
            if(response.data.flag){
                //请求成功
                messageDiv.innerHTML = response.data.message
                let content = ""
                for(let i=0;i<response.data.valueData.length;i++) {
                    let friend = response.data.valueData[i];
                    content += `<tr>
                                    <td>${friend.id}</td>
                                    <td>${friend.name}</td>
                                    <td>${friend.age}</td>
                                </tr>`;
                }

                    myTable.innerHTML += content
                }else{
                    //请求失败
                    messageDiv.innerHTML = response.data.message
                }
            })
    },
    method03(){
        let url = "/Union03Servlet"
        /*
            TODO: 请求数据改成json格式字符串
         */
        // let param = "username=admin&password=123"
        let param = {username : "admin",password : "123"}

        axios.post(url,param).then(response=>{
            console.log(response.data);
            var messageDiv = document.getElementById("messageDiv");
            var myTable = document.getElementById("myTable");
            if(response.data.flag){
                //请求成功
                messageDiv.innerHTML = response.data.message
                let content = ""
                for(let i=0;i<response.data.valueData.length;i++) {
                    let friend = response.data.valueData[i];
                    content += `<tr>
                                    <td>${friend.id}</td>
                                    <td>${friend.name}</td>
                                    <td>${friend.age}</td>
                                </tr>`;
                }
                myTable.innerHTML += content
            }else{
                //请求失败
                messageDiv.innerHTML = response.data.message
            }
        })
    }
  }
}
</script>

<style>

</style>

package com.itheima04.union.vo;

import java.io.Serializable;

public class User implements Serializable {
    private String username;
    private String password;

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

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

package com.itheima03.union;

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Friend;
import com.itheima.pojo.Result;
import com.itheima02.json.User;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

@WebServlet("/Union03Servlet")
public class Union03Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            /*
                TODO 1. 获取请求
                    1). 请求参数是传统格式 name=value&name=value
                        后端获取,用get和post统一获取api即可
                                 String username = request.getParameter("username");
                    2). 请求参数json格式
                        是无法通过 统一格式获取的
                        以post为例, 请求参数在请求体中
             */
//            String username = request.getParameter("username");
//            String password = request.getParameter("password");
//            System.out.println(username + "," + password);


//            ServletInputStream is = request.getInputStream();
//            User user = JSON.parseObject(is, User.class);

            User user = BaseController.getBean(request, User.class);
            System.out.println(user);

            //2. 业务处理

            Friend f1 = new Friend("1001", "张三", 18);
            Friend f2 = new Friend("1002", "李四", 19);
            Friend f3 = new Friend("1003", "王五", 20);
            ArrayList<Friend> list = new ArrayList<>();
            Collections.addAll(list,f1,f2,f3);

            //3. 响应数据
            Result result = new Result(true, "获取好友列表成功", list);
//            response.setContentType("application/json;charset=utf-8");
//            String json = JSON.toJSONString(result);
//            response.getWriter().print(json);

            BaseController.printResult(response,result);
        } catch (Exception e) {
            Result result = new Result(false, "获取好友列表失败");
//            response.setContentType("application/json;charset=utf-8");
//            String json = JSON.toJSONString(result);
//            response.getWriter().print(json);
            BaseController.printResult(response,result);
        }
    }
}

4 抽取BaseController

需求:

1.定义public static T getBean(HttpServletRequest request,Class clazz)方法将请求格式是json的数据封装到实体类对象中

2.定义 public static void printResult(HttpServletResponse response, Result result)方法,将json数据响应给浏览器

package com.itheima03.union;

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Result;
import com.itheima02.json.User;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class BaseController {

    /**
     *  post请求参数为json格式的数据 转换成 javaBean
     */
    public static <T>T getBean(HttpServletRequest request,Class<T> clazz) throws IOException {
        ServletInputStream is = request.getInputStream();
        T t = JSON.parseObject(is, clazz);
        return t;
    }

    public static void printResult(HttpServletResponse response, Result result) throws IOException {
        response.setContentType("application/json;charset=utf-8");
        String json = JSON.toJSONString(result);
        response.getWriter().print(json);
    }
}

posted @   忘了鱼尾纱的猫  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
  1. 1 刘哈哈与大先生 刘心&大鹏
  2. 2 我们打着光脚在风车下跑,手上的狗尾巴草摇啊摇 等一下就回家 / -艾兜
  3. 3 哎呦 毛不易
  4. 4 夜、萤火虫和你 AniFace
我们打着光脚在风车下跑,手上的狗尾巴草摇啊摇 - 等一下就回家 / -艾兜
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词:等一下就回家/艾兜

作曲:等一下就回家/艾兜

混音:裴济逸

编曲:HYPER MUSIC

风是从哪儿来手上的狗尾巴草摇的更剧烈

稻穗也晃起来我紧握着你的手把它拍成照片

我们俩转 就像大风车

早该逃离这我转转 把云卷散了

下个地方 风筝睡醒了

乘着它走吧 飘飘 等着大风车

像在画一幅油画

陶醉你的笑容

就沿着风车走吧

不用 猜忌 下个地点

让我忘记时间to the midnight

the sun came out 把所有染成金色的

风风风让它吹过来

至少年轻我还记得

oh 找一个地方落下

躺在谷仓里

和你讲着小话

什么风都吹不倒它

它就像是活的

知道哪是它的家

风是从哪儿来手上的狗尾巴草摇的更剧烈

稻穗也晃起来我紧握着你的手把它拍成照片

我们俩转 就像大风车

早该逃离这我转转 把云卷散了

下个地方 风筝睡醒了

乘着它走吧 飘飘 等着大风车

像在画一幅油画

陶醉你的笑容

就沿着风车走吧

不用 猜忌 下个地点

我们打着光脚在那风车下跑

等一下就回家怎么才到半山腰

就让那些烦恼都随风去吧

随着稻香飘过的地方耶哎呦喂

喜欢那时候风言风语

总是习惯悲中带着笑

喜欢被无视的童言无忌

被风车带走不在

风是从哪儿来手上的狗尾巴草摇的更剧烈

稻穗也晃起来我紧握着你的手把它拍成照片

我们俩转 就像大风车

早该逃离这我转转 把云卷散了

下个地方 风筝睡醒了

乘着它走吧 飘飘 等着大风车

像在画一幅油画

陶醉你的笑容

就沿着风车走吧

不用 猜忌 下个地点

点击右上角即可分享
微信分享提示