美文网首页
89、【JavaEE】【JSON】JSON

89、【JavaEE】【JSON】JSON

作者: yscyber | 来源:发表于2021-10-04 21:32 被阅读0次

1、概述

  • JSON,全称 JavaScript Object Notation(JavaScript 对象符号)。

  • JSON 是一种轻量级的数据交换格式

  • 虽然 JSON 中带有 JavaScript 字样,但并不意味着 JSON 这种数据格式只适用于 JavaScript 这一种编程语言中。JSON 是一种完全独立于编程语言的数据格式,不同的编程语言都可以使用 JSON,不同编程语言之间同样可以使用 JSON 作为数据交换格式(只要约定好)。

  • JSON 采用完全独立于语言的文本格式,就是说不同的编程语言 JSON 数据是一致的。绝大多数编程语言都可以去解析、生成 JSON 这种数据格式。

  • 与 JSON 类似,XML 也可以作为数据交换格式。XML 相比 JSON 来说,是一种“重量级”的,传输过程中比较占用带宽。在数据交换方面,多数情况下,JSON 的使用要远比 XML 要多的多。现在常规的开发模式,前后端分离,采用的数据交换格式一般都是 JSON。

2、JSON 结构

  • JSON 中之所以含 JavaScript,是因为其格式与 JavaScript 的对象类似,而 JSON 的标准也是由 ECMAScript 制定的。
{
    "id": "1234",
    "name": "张三",
    "type": 1
}
  • 结构特点:
    1、外面由{ }括起来;
    2、其中的数据以“键:值”对的形式出现(其中“键”大多以字符串形式出现;“值”可取字符串、数值、数组、对象等)。
    3、每两个“键:值”对以逗号分隔(最后一个“键:值”对可以省略逗号)。
    4、值如果是字符串类型,就必须加引号;如果是数值类型,引号可加可不加。
{
    "arr": [
        {
            "id": "1234",
            "name": "张三"
        },
        {
            "id": "5678",
            "name": "李四"
        }
    ]
}

3、作为数据交换格式

3.1、JSON 作为数据交换最经典的场景:

  • 常规模式前后端分离,使用 JSON 作为数据交换格式:
JSON-1

3.2、Java 对象与 JSON 转换

  • 在 Java Web 开发中,用 POJO 类来封装数据,而数据最终要从服务器后端反馈给前端的,既然说到了用 JSON 作为数据交换格式,那么势必需要 Java 对象与 JSON 数据格式之间进行相互转换。

  • Java 中实现 Java 对象与 JSON 数据格式相互转换的第三方库有很多,比较经典的有:Gson(由 Google 开发,https://github.com/google/gson)、Fastjson(由阿里巴巴开发,https://github.com/alibaba/fastjson,在国内较受欢迎)、Jackson(https://github.com/FasterXML/jackson,是很多框架的默认 JSON 处理工具,比如 Spring)。

  • Gson、Fastjson、Jackson 等第三方库各有优劣,一般的开发无需过多关注这些第三方库的优劣、性能。

3.3、Fastjson

  • 引入 Jar 包方式或 Maven 方式:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>
  • Java 对象转 JSON 数据格式(JSON 字符串):

使用com.alibaba.fastjson.JSON类的public static String toJSONString(Object object)方法。

public class Person {

    private String name;

    private String gender;

    private Integer age;

    public Person() {}

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

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

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

}
import com.alibaba.fastjson.JSON;
import org.junit.Test;

public class JsonTest {

    @Test
    public void test1() {
        Person person = new Person("张三", "男", 20);

        String jsonString = JSON.toJSONString(person);

        System.out.println(jsonString);
        // {"age":20,"gender":"男","name":"张三"}
    }

}
public class Person {

    private String name;

    private String gender;

    private Integer age;

    private Integer[] arr;

    public Person() {}

    public Person(String name, String gender, Integer age, Integer[] arr) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.arr = arr;
    }

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

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

    public Integer[] getArr() {
        return arr;
    }

    public void setArr(Integer[] arr) {
        this.arr = arr;
    }

}
import com.alibaba.fastjson.JSON;
import org.junit.Test;

public class JsonTest {

    @Test
    public void test1() {
        Person person = new Person("张三", "男", 20, new Integer[]{1, 2, 3});

        String jsonString = JSON.toJSONString(person);

        System.out.println(jsonString);
        // {"age":20,"arr":[1,2,3],"gender":"男","name":"张三"}
    }

}
public class CourseGrade {

    private String courseName;

    private Integer courseGrade;

    public CourseGrade() {}

    public CourseGrade(String courseName, Integer courseGrade) {
        this.courseName = courseName;
        this.courseGrade = courseGrade;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public Integer getCourseGrade() {
        return courseGrade;
    }

    public void setCourseGrade(Integer courseGrade) {
        this.courseGrade = courseGrade;
    }

}
public class Person {

    private String name;

    private String gender;

    private Integer age;

    private CourseGrade[] courseGradeArr;

    public Person() {}

    public Person(String name, String gender, Integer age, CourseGrade[] courseGradeArr) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.courseGradeArr = courseGradeArr;
    }

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

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

    public CourseGrade[] getCourseGradeArr() {
        return courseGradeArr;
    }

    public void setCourseGradeArr(CourseGrade[] courseGradeArr) {
        this.courseGradeArr = courseGradeArr;
    }

}
import com.alibaba.fastjson.JSON;
import org.junit.Test;

public class JsonTest {

    @Test
    public void test1() {

        CourseGrade courseGrade1 = new CourseGrade("Java", 100);
        CourseGrade courseGrade2 = new CourseGrade("Vue.js", 98);
        CourseGrade courseGrade3 = new CourseGrade("MySQL", 85);

        Person person = new Person("张三", "男", 20, new CourseGrade[]{courseGrade1, courseGrade2, courseGrade3});

        String jsonString = JSON.toJSONString(person);

        System.out.println(jsonString);
        // {"age":20,"courseGradeArr":[{"courseGrade":100,"courseName":"Java"},{"courseGrade":98,"courseName":"Vue.js"},{"courseGrade":85,"courseName":"MySQL"}],"gender":"男","name":"张三"}
    }

}
  • 注解@JSONField

注解@JSONField的作用是:在 Java 对象转为 JSON 的时候,使用该注解,自定义字段的名称进行输出,并控制字段的排序,还可以决定字段是否进行序列化。

name:字段的名称
ordinal:字段的顺序,越小的排在前面
serialize:字段是否序列化(是否转换为 JSON),true参与序列化,false不参与序列化

import com.alibaba.fastjson.annotation.JSONField;

public class CourseGrade {

    @JSONField(name = "Course-Name", ordinal = 0, serialize = true)
    private String courseName;

    @JSONField(name = "Course-Grade", ordinal = 1, serialize = true)
    private Integer courseGrade;

    public CourseGrade() {}

    public CourseGrade(String courseName, Integer courseGrade) {
        this.courseName = courseName;
        this.courseGrade = courseGrade;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public Integer getCourseGrade() {
        return courseGrade;
    }

    public void setCourseGrade(Integer courseGrade) {
        this.courseGrade = courseGrade;
    }

}
import com.alibaba.fastjson.annotation.JSONField;

public class Person {

    @JSONField(name = "Name", ordinal = 0, serialize = true)
    private String name;

    @JSONField(name = "Gender", ordinal = 1, serialize = true)
    private String gender;

    @JSONField(name = "Age", serialize = false)
    private Integer age;

    @JSONField(name = "Course-Grade-List", ordinal = 2, serialize = true)
    private CourseGrade[] courseGradeArr;

    public Person() {}

    public Person(String name, String gender, Integer age, CourseGrade[] courseGradeArr) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.courseGradeArr = courseGradeArr;
    }

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

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

    public CourseGrade[] getCourseGradeArr() {
        return courseGradeArr;
    }

    public void setCourseGradeArr(CourseGrade[] courseGradeArr) {
        this.courseGradeArr = courseGradeArr;
    }

}
import com.alibaba.fastjson.JSON;
import org.junit.Test;

public class JsonTest {

    @Test
    public void test1() {

        CourseGrade courseGrade1 = new CourseGrade("Java", 100);
        CourseGrade courseGrade2 = new CourseGrade("Vue.js", 98);
        CourseGrade courseGrade3 = new CourseGrade("MySQL", 85);

        Person person = new Person("张三", "男", 20, new CourseGrade[]{courseGrade1, courseGrade2, courseGrade3});

        String jsonString = JSON.toJSONString(person);

        System.out.println(jsonString);
        // {"Name":"张三","Gender":"男","Course-Grade-List":[{"Course-Name":"Java","Course-Grade":100},{"Course-Name":"Vue.js","Course-Grade":98},{"Course-Name":"MySQL","Course-Grade":85}]}
    }

}
  • JSON 数据格式(JSON 字符串)转 Java 对象:

使用com.alibaba.fastjson.JSON类的public static <T> T parseObject(String text, Class<T> clazz)方法。

成功转换的前提是,必须有setter/getter

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class Person {

    private String myName;

    private String myGender;

}
import com.alibaba.fastjson.JSON;

import com.yscyber.json.one.Person;

import org.junit.Test;

public class JsonTest {

    @Test
    public void test1() {
        String jsonStr = "{'myName': '张三', 'myGender': '男'}";

        Person person = JSON.parseObject(jsonStr, Person.class);
        System.out.println(person); // Person(myName=张三, myGender=男)
    }

}

@JSONField中的name属性:

import com.alibaba.fastjson.annotation.JSONField;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class Person {

    @JSONField(name = "x")
    private String myName;

    @JSONField(name = "y")
    private String myGender;

}
import com.alibaba.fastjson.JSON;

import com.yscyber.json.one.Person;

import org.junit.Test;

public class JsonTest {

    @Test
    public void test1() {
        String jsonStr = "{'x': '张三', 'y': '男'}";

        Person person = JSON.parseObject(jsonStr, Person.class);
        System.out.println(person); // Person(myName=张三, myGender=男)
    }

}

自动忽略大小写、“下划线”转“驼峰”:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class Person {

    private String myName;

    private String myGender;

}
import com.alibaba.fastjson.JSON;

import com.yscyber.json.one.Person;

import org.junit.Test;

public class JsonTest {

    @Test
    public void test1() {
        String jsonStr = "{'my_name': '张三', 'my_gender': '男'}";

        Person person = JSON.parseObject(jsonStr, Person.class);
        System.out.println(person); // Person(myName=张三, myGender=男)
    }

}

3.4、JavaScript 关于 JSON 的处理

  • 多数情况下,JavaScript 能够自动的将后端响应回的 JSON 字符串自动解析成一个 JavaScript 对象。

  • JavaScript 原生关于 JSON 的处理:

object JSON.parse(string):JSON 字符串转 JavaScript 对象;
string JSON.stringify(object):JavaScript 对象转 JSON 字符串;

    let obj = JSON.parse("{\"name\": \"张三\", \"age\": 20}");
    console.log(obj);
    console.log(typeof obj);

    let str = JSON.stringify(obj);
    console.log(str);
    console.log(typeof str);

注意:object JSON.parse(string)中的参数,JSON 字符串中不能含有单引号:

let jsonStr = "{\"name\": \"张三\", \"age\": 20}"; //正确,内部使用转义字符

let jsonStr = '{"name": "张三", "age": 20}'; // 正确,因为使用单引号包裹可以,内部可以直接使用双引号,无需转义

let jsonStr = "{'name': '张三', 'age': 20}"; // 错误

相关文章

网友评论

      本文标题:89、【JavaEE】【JSON】JSON

      本文链接:https://www.haomeiwen.com/subject/ntfdnltx.html