JavaWeb学习总结(十六)JSON

一、概述

  • JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON 采用完全独立于语言的文本格式,而且很多语言都提供了对 JSON 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python 等)。 这样就使得 JSON 成为理想的数据交换格式。
  • 轻量级指的是跟 xml 做比较。
  • 数据交换指的是客户端服务器之间业务数据的传递

二、JSON在JavaScript中的使用

(一)JSON的定义

在标准的 json 格式中,json 对象由大括号括起来,json 是由键值对组成,每个键由双引号引起来,键和值之间使用冒号进行分隔, 多组键值对之间进行逗号进行分隔。

格式

var 变量名 = { 
	"key" : value , // Number 类型 
	"key2" : "value" , // 字符串类型 
	"key3" : [] , // 数组类型 
	"key4" : {} , // json 对象类型 
	"key5" : [{},{}] // json 数组
 };

案例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
	<script type="text/javascript">
        // json的定义
        var jsonObj = {
            "key1":12,
            "key2":"abc",
            "key3":true,
            "key4":[11,"abcd",false],
            "key5":{
                "key5_1" : 551,
                "key5_2" : "key5_2_value"
            },
            "key6":[{
                "key6_1_1":6611,
                "key6_1_2":"key6_1_2_value"
            },{
                "key6_2_1":6621,
                "key6_2_2":"key6_2_2_value"
            }]
        };
	</script>
</head>
<body>

</body>
</html>

(二)JSON的访问

  • json 本身是一个对象。
  • json 中的 key 我们可以理解为是对象中的一个属性。
  • json 中的 key 访问就跟访问对象的属性一样: json 对象.key

案例
接上面

alert(typeof(jsonObj));// object json 就是一个对象 
alert(jsonObj.key1); //12 
alert(jsonObj.key2); // abc 
alert(jsonObj.key3); // true 
alert(jsonObj.key4);// 得到数组[11,"abcd",false] 
// json 中 数组值的遍历 
for(var i = 0; i < jsonObj.key4.length; i++) { 
	alert(jsonObj.key4[i]); 
}
alert(jsonObj.key5.key5_1);//551 
alert(jsonObj.key5.key5_2);//key5_2_value 
alert( jsonObj.key6 );// 得到 json 数组 
// 取出来每一个元素都是 json 对象 
var jsonItem = jsonObj.key6[0]; 
alert( jsonItem.key6_1_1 ); //6611 
alert( jsonItem.key6_1_2 ); //key6_1_2_value

(三)JSON的两个常用方法

  • json 的存在有两种形式。 一种是以对象的形式存在,我们叫它 json 对象。 一种是以字符串的形式存在,我们叫它 json 字符串
  • 一般我们要操作 json 中的数据的时候,需要 json 对象的格式。
  • 一般我们要在客户端和服务器之间进行数据交换的时候,使用 json 字符串。
  • JSON 对象和字符串对象的互转
  • JSON.stringify( json ) 把 json 对象转换成为 json 字符串
  • JSON.parse( jsonString ) 把 json 字符串转换成为 json 对象

案例
接上面

// 把json对象转换成为 json字符串
var jsonObjString = JSON.stringify(jsonObj); // 特别像 Java对象中的 toString方法
alert(jsonObjString);
// 把json字符串。转换成为json对象
var jsonObj2 = JSON.parse(jsonObjString);
alert(jsonObj2.key1);// 12
alert(jsonObj2.key2);// abc

三、JSON在 JAVA 中的使用

(一)第三方类库

Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库。

下面是几个常用的 JSON 解析类库:

  • Gson: 谷歌开发的 JSON 库,功能十分全面。(Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转换成一个 Java 对象,或者反过来)
  • FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。
  • Jackson: 社区十分活跃且更新速度很快。

本文采用Gson,可以去Maven仓库下载 gson.jar,并复制进web工程里,然后Add as library

(二)javaBean 和 json 的互转

Person类:

public class Person {

    private Integer id;
    private String name;

    public Person() {
    }

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

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

测试类:

import com.fox.bean.Person;
import com.google.gson.Gson;

public class JsonTest {
    public static void main(String[] args) {
        Person person = new Person(1, "小明");
        // 创建Gson对象实例
        Gson gson = new Gson();
        // toJson方法可以把java对象转换成为json字符串
        String personJsonString = gson.toJson(person);
        System.out.println(personJsonString);
        // fromJson把json字符串转换回Java对象
        // 第一个参数是json字符串
        // 第二个参数是转换回去的Java对象类型
        Person person1 = gson.fromJson(personJsonString, Person.class);
        System.out.println(person1);
    }
}

java json格式是什么类型 json是java吗_javascript

(三)List 和 json 的互转

  • 当json字符串要转换回的对象是javabean,就可以用fromJson(String s,Class<T> classOfT)
  • 当json字符串要转换回的对象是参数化类型(List或Map)就用fromJson(String s,Type typeOfT)

在我们导入的gson.jar包中给我们提供了一个TypeToken类(TypeToken 是google提供的一个解析Json数据的类库中一个类)

案例

  • 方法一
    只要将需要获取类型的泛型类作为TypeToken的泛型参数创建一个TypeToken的子类,就可以通过该子类的对象的getType()方法获取到我们使用的泛型类的泛型参数类型,即fromJson的第二个参数,举例如下:

创建一个TypeToken的子类:

import com.fox.bean.Person;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;

public class PersonListType extends TypeToken<ArrayList<Person>> {//需要获取类型的泛型类作为TypeToken的泛型参数
}

测试类:

import com.fox.bean.Person;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;

public class JsonTest {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1, "小明"));
        personList.add(new Person(2, "小红"));
        // 创建Gson对象实例
        Gson gson = new Gson();
        // 把List转换为json字符串
        String personListJsonString = gson.toJson(personList);
        System.out.println(personListJsonString);
        // fromJson把json字符串转换回List
        List<Person> list = gson.fromJson(personListJsonString,new PersonListType().getType());
        System.out.println(list);
        Person person = list.get(0);
        System.out.println(person);
    }
}

java json格式是什么类型 json是java吗_json_02

  • 方法二
    方法一创建子类的方式很麻烦,我们其实也可以用匿名内部类的方法:
    只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型,即fromJson的第二个参数,举例如下:
import com.fox.bean.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;

public class JsonTest {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1, "小明"));
        personList.add(new Person(2, "小红"));
        // 创建Gson对象实例
        Gson gson = new Gson();
        // 把List转换为json字符串
        String personListJsonString = gson.toJson(personList);
        System.out.println(personListJsonString);
        // fromJson把json字符串转换回List
        List<Person> list = gson.fromJson(personListJsonString, new TypeToken<List<Person>>() {}.getType());
        System.out.println(list);
        Person person = list.get(0);
        System.out.println(person);
    }
}

java json格式是什么类型 json是java吗_java json格式是什么类型_03

(四)Map 和 json 的互转

与List和json互转类似。

案例

import com.fox.bean.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;
import java.util.Map;

public class JsonTest {
    public static void main(String[] args) {
        Map<Integer,Person> personMap = new HashMap<>();
        personMap.put(1, new Person(1, "小明"));
        personMap.put(2, new Person(2, "小红"));
        // 创建Gson对象实例
        Gson gson = new Gson();
        // 把 Map 集合转换成为 json字符串
        String personMapJsonString = gson.toJson(personMap);
        System.out.println(personMapJsonString);
        // fromJson把json字符串转换回Map集合
        Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new TypeToken<HashMap<Integer,Person>>(){}.getType());
        System.out.println(personMap2);
        Person p = personMap2.get(1);
        System.out.println(p);
    }
}

java json格式是什么类型 json是java吗_JSON_04