Bootstrap

数据交换技术JSON(适用知识的回顾复习,建议收藏!!!)

一. 了解JSON

Json的在线官方文档

JSON 指的是 JavaScript 对象表示法。
JSON 是轻量级的文本数据交换格式。
JSON 独立于 语言 [ java php asp.net , go 等都可以使用 JSON]。
JSON 具有自我描述性,更易理解。

举个例子(解决用JSON的原因)

当前端界面要发送http请求给后端界面时,有时会携带一些数据,那数据的传送我们可以通过Json的数据格式传送,为什么选用Json传送数据而不是文本呢 ? 因为更方便程序员的操作。

 那可能会问以前不是用xml进行数据的交换吗?可以是可以但是xml更适合做文件配置。JSON做数据交换要更好用、

二.  Json的数据格式,以及如何取数据

数据类型大概如图所示        

规则:

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

如何取出数据,举个案例 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSON入门案例</title>
</head>
<body>
<script type="text/javascript">
  //定义了一个Json对象
  let myJson = {
    "key1":"hs", //字符串
    "key2":123, //Number
    "key3":[1,"hello",2.3], //数组
    "key4":{"age":12,"name":"jack"}, //Json对象
    "key5":[
      {"k1":10,"k2":"m"},
      {"k3":30,"k4":"s"}
    ]
  };
  //1.取出key1
  console.log("key1=",myJson.key1);
  //2.取出key3
  console.log("key3=",myJson.key3);
  //取出key3中具体的数据
   for(let i = 0;i<myJson.key3.length;i++)
   {
     console.log("第%i个元素的值是=",i,myJson.key3[i]);
   }
  //3.取出key4的值
  console.log("key4=",myJson.key4);
  console.log("name=",myJson.key4.name);
  //4.取出key5
  console.log("key5=",myJson.key5);
  console.log("k4的值",myJson.key5[1].k4);


</script>
</body>
</html>

三. JSON对象和字符串的相互转换

1. JSON.stringify(json)功能 :      将一个 json 对象转换成为 json 字符串 [ 简单说名字来源 .]
Serialize
2. JSON.parse( jsonString )功能 :     将一个 json 字符串转换成为 json 对象

 案例分析:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSON对象和字符串对象转换</title>
</head>
<body>
<h1>JSON对象和字符串对象转换</h1>
<script type="text/javascript">
  window.onload = function () {
    //JSON是js的内置对象可以直接使用

    //1. 将JSON对象转换成String
    let JsonPerson = {
      "name":"jack",
      "age":20,
    }
    let stringJson = JSON.stringify(JsonPerson);
    console.log("JSON对象=",JsonPerson, "类型->",typeof JsonPerson);
    console.log("JSON字符串=",stringJson,"类型->",typeof stringJson);

    //string -> Json
    //字符串必须要满足Json的格式
    let str = "{\"name\":\"jack\",\"age\":20}";
    let json = JSON.parse(str);
    console.log("json对象=",json,"类型=",typeof json);
  }
</script>
</body>
</html>

注意JSON对象和字符串对象相互转换的细节 

1 JSON.springify(json 对 象 ) 会 返 回对 应 string, 并 不 会影 响 原 来 json 对 象 , 演 示
json_string_detail .html
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中的应用

前后端在发送数据的同时,如果前端想要一个对象,我们不可能把对象直接返回给前端吧,肯定需要把对象转换为字符串再返回给前端,同样list数组以及map集合也需要转换成json的字符串

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

应用场景如下 

一.JSON字符串的JavaBean的互转

注意一定要引入第三方库Gson。!!!

首先为接下来的所有例子都定义一个Book类

/**
 * @author sn
 */
public class Book {
    private String name;
    private int ID;

    public String getName() {
        return name;
    }

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

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public Book(String name, int ID) {

        this.name = name;
        this.ID = ID;
    }
}

 

import com.google.gson.Gson;

/**
 * @author sn
 */
public class transform {
    public static void main(String[] args) {
        // new 一个 gson 对象。引入 gson 包
        Gson gson = new Gson();
        //1. java 对象和 json 的转换
        Book book = new Book("五灵王",23);
        // 把对象转成为 json 字符串
        String bookStr = gson.toJson(book);
        System.out.println(bookStr);
        // 把 json 字符串转换成为 java 对象
        Book book2 = gson.fromJson(bookStr, Book.class);
        System.out.println(book2);
    }
}

输出结果: 

 

二.List对象和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 sn
 */
public class transform {
    public static void main(String[] args) {
        // new 一个 gson 对象。引入 gson 包
        Gson gson = new Gson();
        //JSON字符串和List集合的转换
        ArrayList<Book> books = new ArrayList<>();
        books.add(new Book("小红薯",1));
        books.add(new Book("小红书",2));

        //对象和集合转换成字符串都比较容易如下
        String json = gson.toJson(books);

        //但是转成Json对象就比较麻烦了,给大家分析一波
        Type type = new TypeToken<List<Book>>() {}.getType();
        List<Book> list = gson.fromJson(json, type);
        System.out.println(json);
        System.out.println(list);
        //
    }
}

具体分析  Type type = new TypeToken<List<Book>>() {}.getType();底层机制!!!

当我们输出type的时候输出的结果是

java.util.List<Book>

由此可知type类型是为了得到字符串转换为集合所要求的具体的这些类是在哪些库中的,因为底层用了反射的机制,要去映射成正确的信息,所以必须知道这些具体的类型是在哪些具体的库中。不同的库可能会有相同的名字的方法。 

 三. Map集合和JSON字符串的互转
 

就和List是一样的用法

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 sn
 */
public class transform {
    public static void main(String[] args) {
        // new 一个 gson 对象。引入 gson 包
        Gson gson = new Gson();
        //3. map 集合和 json 的转换
        System.out.println("\n====3. map 集合和 json 的转换=====");
        Map<String, Book> bookMap = new HashMap<>();
        bookMap.put("1", new Book("射雕英雄传",10));
        bookMap.put("2", new Book("王者峡谷",20));
// 把 map 转换成为 json
        String bookMapStr = gson.toJson(bookMap);
        System.out.println("bookMapStr=" + bookMapStr + " 类 型 =" +
                bookMapStr.getClass());
// 把 json 转成 map
        Map<String, Book> bookMap2 = gson.fromJson(bookMapStr, new
                TypeToken<HashMap<String, Book>>() {
                }.getType());
        System.out.println("bookMap2=" + bookMap2 + " 类型=" + bookMap2.getClass());
    }
}


输出结果 

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;