一. 了解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 字符串 [ 简单说名字来源 .]Serialize2. 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 .html2 、 JSON.parse(string) 函数会返回对应的 json 对象 , 并不会影响原来 string3 、在定义 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.jar2. 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());
}
}
输出结果