数据交换-JSON


JSON介绍

  1. JSON指的是JavaScript对象表示法(JavaScript Object Notation)
  2. JSON是轻量级的文本数据交换格式
  3. JSON独立于语言【即 java . php、asp.net等都可以使用JSON】
  4. JSON具有自我描述性,更易理解

数据交换格式:浏览器向tomcat发送http请求,为了让程序更好的获得请求中的数据,会按照JSON格式来发送。tomcat在处理完数据,会给浏览器返回一个响应,当然为了浏览器更好的得到响应携带的数据,也会按照JSON格式来发送

解读JSON规则

  1. 映射(元素/属性)用冒号∶表示,"名称":值,注意名称是字符串,因此要用双引号引起来
  2. 并列的数据之间用逗号,分隔。"名称1":值,"名称2":值
  3. 映射的集合(对象)用大括号{表示。{"名称1":值,"名称2":值} . 两边是{}是json对象
  4. 并列数据的集合(数组)用方括号[]表示。[{"名称1":值,"名称2":值},{"名称1";:值,"名称2";值}] .两边是[]是json数组
  5. 元素值类型: string, number, object, array, true, false, null

JSON与字符串互转

  1. JSON.stringify(json)功能:将一个json对象转换成为json字符串
  2. JSON.parse(jsonString)功能:将一个json字符串转换成为json对象

JSON转换为字符串

    <script type="text/javascript">
        window.onload = function () {
            var jsonPerson = {
                "name": "jack",
                "age": 20
            }   
            var strPerson = JSON.stringify(jsonPerson);                 	
        }        
    </script>                

字符串转换为JSON

    <script type="text/javascript">
        window.onload = function () {
            //字符串转为json对象
            //注意要转成json对象的string格式必须满足json格式
            var strDog = "{\"name\":\"jack\",\"age\":20}";
            var jsonDog = JSON.parse(strDog);        	
        }          
    </script> 

JSON与字符串互相转换细节

  1. JSON.springify(json对象)会返回对应string,并不会影响原来json对象
  2. JSON.parse(string)函数会返回对应的json对象,并不会影响原来string
  3. 在定义Json对象时,可以使用' '表示字符串
    比如 var json_person = "name": "jack", "age": 100};
    也可以写成var json_person = 'name': 'jack', 'age': 100};
  4. 但是在把原生字符串转成json对象时,必须使用" ",否则会报错
    比如:var str_dog = "{'name':'小黄狗', 'age': 4";转json就会报错
  5. JSON.springify(json对象)返回的字符串,都是" "表示的字符串,所以在语法格式正确的情况下,是可以重新转成json对象的

JSON在Java中的使用
前端将JSON字符串发送给后端-->后端接收到JSON字符串后-->需要转换成Java对象(Javabean、List、map)进行处理
将处理完的Java对象-->转换为JSON字符串-->发送给前端

  1. java中使用json,需要引入到第3方的包gson.jar
  2. Gson是Google提供的用来在Java对象和JSON 数据之间进行映射的Java类库。
  3. 可以对JSON字符串和Java对象相互转换

gson.toJson(Java对象):Java对象(JavaBean、List对象、Map对象)转换成Json字符串
gson.fromJson(json字符串, Java对象的class对象):json字符串转换成Java对象

Java对象的class对象:如果是JavaBean,可以JavaBean.class。但如果是是比较复杂的对象,就需要使用new TypeToken<Java对象类型>() {}.getType();来获取对应的class对象


Java对象与JSON字符串互相转换

public class JavaBean {
    public static void main(String[] args) {
        //创建一个gson对象,做完一个工具对象使用
        Gson gson = new Gson();
        Book book = new Book(10, "快乐学Java");
        
        //演示把JavaBean -> json对象
        String strBook = gson.toJson(book);       
        
        //json字符串 -> JavaBean
        //(1) strBook就是json字符串
        //(2) Book.class指定将json字符串转成Book对象
        //(3)底层是反射机制
        Book book2 = gson.fromJson(strBook, Book.class);     	
    }
}


List对象与JSON字符串转换

public class JavaBean {
    public static void main(String[] args) {
        //3. 演示把list对象 -> json字符串
        ArrayList<Book> bookList = new ArrayList<>();
        bookList.add(new Book(20,"三国演义"));
        bookList.add(new Book(30,"红楼梦"));    	

		//演示把list对象 -> json字符串
		String strBookList = gson.toJson(bookList);

		//演示把json字符串 -> list对象
        Type type = new TypeToken<List<Book>>() {}.getType();
        Object bookList2 = gson.fromJson(strBookList, type);		
    }
}

new TypeToken<List<Book>>() {}.getType();

  1. 如果需要把json字符串 转成 集合这样复杂的类型, 就需要TypeToken
  2. TypeToken , 是一个自定义泛型类, 然后通过TypeToken来获取指定的类型的绝对路径(反射需要通过类的绝对路径来创建实例)

为什么要在new TypeToken<List<Book>>() 后面加上 {}

  1. TypeToken的无参构造是protected修饰(只有 同类、同包、子类可以访问),因此如果TypeToken<List<Book>>()这样写,是不会创建成功的
  2. new TypeToken<List<Book>>(){}的意思:创建一个继承了TypeToken的匿名类部类--> 前面的()是调用该匿名类部类的无参构造-->无参构造前面默认有一个super(); --> 最终调用TypeToken的无参构造(protected:子类是可以访问的)-->创建成功

Map对象与JSON字符串转换

public class JavaBean {
    public static void main(String[] args) {
        Map<String, Book> mapBook = new HashMap<>();
        mapBook.put("20", new Book(50, "水浒传"));
        mapBook.put("30", new Book(60, "西游记"));

		//演示把map对象转换成json字符串
		String strBookMap = gson.toJson(mapBook);
		
		//演示把json字符串转换成map对象
		Map<String, Book> JsonBookMap = gson.fromJson(strBookMap, new TypeToken<Map<String, Book>>() {}.getType());
    }
}


JSON介绍

数据交换格式:浏览器向tomcat发送http请求,为了让程序更好的获得请求中的数据,会按照JSON格式来发送。tomcat在处理完数据,会给浏览器返回一个响应,当然为了浏览器更好的得到响应携带的数据,也会按照JSON格式来发送
在这里插入图片描述

JSON因为处理数据非常方便,已经成为前后端交互的通用的数据格式
在这里插入图片描述

JSON使用

JSON数据都是以 "k-v"的形式来保存
在这里插入图片描述

解读JSON规则
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>json 快速入门案例</title>
    <script type="text/javascript">
        window.onload = function () {
            var myJson = {
                "key1": "我是字符串",  // 字符串
                "key2": 123,    // Number
                "key3": [1, "hello", 2.3],  // 数组
                "key4": {"age": 12, "name": "jack"},  //json对象
                "key5": [      //json数组 //json数组保存的数据类型是可以不相同的
                    {"k1": 10, "k2": "milan"},
                    {"k3": 30, "k4": "smith"},

                ]
            };
            //1.取出k1
            console.log("key1=", myJson.key1);

            //2.取出k3
            console.log("key3=", myJson.key3);
            // 可以对key3取出的值(Array),遍历
            for (var i = 0; i < myJson.key3.length; i++) {
                console.log("第%i个元素的值=", i, myJson.key3[i]);
            }
            //3.取出key4
            console.log("key4=" ,myJson.key4 , " name=" ,myJson.key4.name);

            //4.取出key5
            console.log("key5=",myJson.key5, " k4=" , myJson.key5[1].k4);
        }
    </script>
</head>
<body>
<h1>json 快速入门案例</h1>
</body>
</html>

在这里插入图片描述

JSON转字符串

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSON对象和字符串对象转换</title>
    <script type="text/javascript">
        window.onload = function () {
            //解读JSON
            //1.JSON是一个js的内置对象(build-in),可以直接使用
            console.log("JSON=", JSON);

            var jsonPerson = {
                "name": "jack",
                "age": 20
            }
            console.log("jsonPerson=" ,jsonPerson);
            //演示如何将以json对象->string
            var strPerson = JSON.stringify(jsonPerson);
            console.log("strPerson=" ,strPerson , "strPerson类型" ,typeof strPerson);
        }
    </script>
</head>
<body>
<h1>JSON对象和字符串对象转换</h1>

</body>
</html>

在这里插入图片描述

字符串转JSON

注意要转成json对象的string格式必须满足json格式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSON对象和字符串对象转换</title>
    <script type="text/javascript">
        window.onload = function () {
            //字符串转为json对象
            //注意要转成json对象的string格式必须满足json格式
            var strDog = "{\"name\":\"jack\",\"age\":20}";
            var jsonDog = JSON.parse(strDog);
            console.log("jsonDog=", jsonDog, "jsonDog类型=", typeof jsonDog);
        }
    </script>
</head>
<body>
<h1>JSON对象和字符串对象转换</h1>

</body>
</html>

在这里插入图片描述

如果不是JSON格式,会报错

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSON对象和字符串对象转换</title>
    <script type="text/javascript">
        window.onload = function () {
            var strCat = "{\"123\"}";
            var jsonCat = JSON.parse(strCat);
        }
    </script>
</head>
<body>
<h1>JSON对象和字符串对象转换</h1>

</body>
</html>

在这里插入图片描述

JSON与字符串互相转换细节

在这里插入图片描述
1.JSON.springify(json对象) 会返回对应string, 并不会影响原来json对象

    <script type="text/javascript">
        //1. JSON.springify(json对象) 会返回对应string, 并不会影响原来json对象
        var jsonPerson = {
            "name": "jack",
            "age": 20
        }
        var strPerson = JSON.stringify(jsonPerson);
        console.log("jsonPerson类型=" , typeof jsonPerson);
        console.log("strPerson类型=" , typeof strPerson);
   </script>

在这里插入图片描述
2. JSON.parse(string) 函数会返回对应的json对象, 并不会影响原来string

    <script type="text/javascript">
  	    //2. JSON.parse(string) 函数会返回对应的json对象, 并不会影响原来string
        var strDog = "{\"name\":\"小黄狗\", \"age\":2}";
        var jsonDog = JSON.parse(strDog);
        console.log("strDog类型=" , typeof strDog);
        console.log("jsonDog类型=" , typeof jsonDog);
    </script>

在这里插入图片描述

3.在定义Json对象时, 可以使用 ' ' 表示字符串
不加 ' '" " 也是可行的,但是为了规范,建议还是加上 " "

    <script type="text/javascript">
	        var jsonCat = {
	        'name': '小黑',
	        'age': 3
        }
        var strCat = JSON.stringify(jsonCat);
        console.log("strCat=" , strCat);
    </script>

在这里插入图片描述

4.但是在把原生字符串转成 json对象时, 必须使用 " ", 否则会报错 比如

    <script type="text/javascript">
        //4. 但是在把原生字符串转成 json对象时, 必须使用 "", 否则会报错 比如
        var strFish = "{'name':'小青鱼', 'age':3}"; //不加单引号也不行
        var JSONFish = JSON.parse(strFish);
        console.log("JSONFish=", JSONFish);
    </script>

在这里插入图片描述

    <script type="text/javascript">
        var strFish = "{\"name\":\"小青鱼\", \"age\":3}";
        var JSONFish = JSON.parse(strFish);
        console.log("JSONFish=", JSONFish);
    </script>

在这里插入图片描述

5.JSON.springify(json对象) 返回的字符串,可以重新转回JSON对象

    <script type="text/javascript">
        //5. JSON.springify(json对象) 返回的字符串, 都是 "" 表示的字符串
        var strPerson2 = JSON.stringify(jsonPerson);
        var parse = JSON.parse(strPerson2);
        console.log("parse=", parse);
    </script>

在这里插入图片描述

JSON在Java中的使用

前端将JSON字符串发送给后端-->后端接收到JSON字符串后-->需要转换成Java对象(Javabean、List、map)进行处理
将处理完的Java对象->转换为JSON字符串-->发送给前端
在这里插入图片描述
在这里插入图片描述

Java对象与JSON字符串互相转换

package com.study.json;

import com.google.gson.Gson;

/**
 * @author 珀筱
 */
@SuppressWarnings({"all"})
public class JavaBean {
    public static void main(String[] args) {
        //创建一个gson对象,做完一个工具对象使用
        Gson gson = new Gson();
        //演示javaBean和json字符串的转换
        Book book = new Book(10, "快乐学Java");

        //1.演示把JavaBean -> json对象
        String strBook = gson.toJson(book);
        System.out.println("strBook=" + strBook);
        //2.json字符串 -> JavaBean
        //(1) strBook就是json字符串
        //(2) Book.class指定将json字符串转成Book对象
        //(3)底层是反射机制
        Book book2 = gson.fromJson(strBook, Book.class);
        System.out.println("book2=" + book2);
    }
}

在这里插入图片描述

List对象与JSON字符串转换

package com.study.json;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 珀筱
 */
@SuppressWarnings({"all"})
public class JavaBean {
    public static void main(String[] args) {
        //创建一个gson对象,做完一个工具对象使用
        Gson gson = new Gson();
        //演示javaBean和json字符串的转换
        Book book = new Book(10, "快乐学Java");

        //3. 演示把list对象 -> json字符串
        ArrayList<Book> bookList = new ArrayList<>();
        bookList.add(new Book(20,"三国演义"));
        bookList.add(new Book(30,"红楼梦"));

        //底层只需要遍历, 按照json格式拼接返回即可
        String strBookList = gson.toJson(bookList);
        System.out.println(strBookList);

        //4. 演示把json字符串 -> list对象
        //(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类
        //(2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型
        /*
            package com.google.gson.reflect;
            public class TypeToken<T> {
            final Class<? super T> rawType;
            final Type type;
            final int hashCode;
         */
        //(1) 返回类型的完整路径java.util.List<com.hspedu.json.Book>
        //(2) gson的设计者,需要得到类型的完整路径,然后进行底层反射
        //(3) 所以gson 设计者就提供TypeToken, 来搞定.
        //后面的类型为什么不能直接写List<book>,因为一个包下可能包含多个List和book
        // 但反射就需要一个确定的地址来创建实例,因此需要显示 提供的TypeToken来获得类型的绝对路径

        //(1) 如果我们  new TypeToken<List<Book>>()  提示
        // 'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken' (无参构造器是受保护,不能访问)
        //(2) 因为TypeToken 的无参构造器是protected , 而 new TypeToken<List<Book>>() 就是调用其无参构造器
        //(3) 根据java基础, 如果一个方法是protected ,而且不在同一个包, 是不能直接访问的, 因此报错
        //(4) new TypeToken<List<Book>>(){} 这是创建一个匿名类部类(继承了TypeToken的子类),
        //  后面()相当于调用了匿名类部类对象的无参构造器,而无参构造器最前有super()方法,便又会去调用TypeToken的无参构造器
        //  protected类型是允许子类访问,因此可以创建成功
        //(5) 当 new TypeToken<List<Book>>(){} 其实这个类型就是不是 TypeToken 而是一个匿名内部类(子类)
        //(6) 而且这个匿名内部类是有自己的无参构造器(隐式), 根据java基础规则 当执行子类的无参构造器时, 默认super();
        Type type = new TypeToken<List<Book>>() {}.getType();
        Object bookList2 = gson.fromJson(strBookList, type);
        System.out.println("bookList2=" + bookList2);
    }
}

在这里插入图片描述

Map对象与JSON字符串转换

package com.study.json;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 珀筱
 */
@SuppressWarnings({"all"})
public class JavaBean {
    public static void main(String[] args) {
        //创建一个gson对象,做完一个工具对象使用
        Gson gson = new Gson();
        //演示javaBean和json字符串的转换
        Book book = new Book(10, "快乐学Java");
        
        //5. 演示把map对象转换成json字符串
        Map<String, Book> mapBook = new HashMap<>();
        mapBook.put("20", new Book(50, "水浒传"));
        mapBook.put("30", new Book(60, "西游记"));

        String strBookMap = gson.toJson(mapBook);
        System.out.println(strBookMap);

        //6. 演示把json字符串转换成map对象
        Map<String, Book> JsonBookMap = gson.fromJson(strBookMap, new TypeToken<Map<String, Book>>() {}.getType());
        System.out.println(JsonBookMap);

    }
}

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值