• JSON 语法规则
  • JSON与Java的序列化与反序列化
  • JSON与JavaScript

    JSON 是轻量级的文本数据交换格式 JSON 独立于语言,具有自我描述性,更容易理解

JSON是JavaScript Object Notation 的缩写

  • JSON由键/值描述,由逗号分隔
  • 大括号表示一个完整的对象,拥有多个键/值对
  • 中括号表示数据,多个对象之间使用逗号分隔

JSON 格式如下:

  1. [
  2. {
  3. "empno": 1001,
  4. "ename": "JakePrim",
  5. "job": "软件工程师",
  6. "date": "2019-10-10",
  7. "salary": 17000,
  8. "dname": "研发部"
  9. },
  10. {
  11. "empno": 1002,
  12. "ename": "JakePrim2",
  13. "job": "市场管理员",
  14. "date": "2019-10-11",
  15. "salary": 1700,
  16. "dname": "市场部",
  17. "customers": [
  18. {
  19. "cname": "历史"
  20. },
  21. {
  22. "cname": "张三"
  23. }
  24. ]
  25. }
  26. ]

JavaScript 使用JSON

javascript 天然的支持json和处理json的能力. 如下代码:

  1. var json = [
  2. {
  3. "empno": 1001,
  4. "ename": "JakePrim",
  5. "job": "软件工程师",
  6. "date": "2019-10-10",
  7. "salary": 17000,
  8. "dname": "研发部"
  9. },
  10. {
  11. "empno": 1002,
  12. "ename": "JakePrim2",
  13. "job": "市场管理员",
  14. "date": "2019-10-11",
  15. "salary": 1700,
  16. "dname": "市场部",
  17. "customers": [
  18. {
  19. "cname": "历史"
  20. },
  21. {
  22. "cname": "张三"
  23. }
  24. ]
  25. }
  26. ];
  27. //输出json
  28. console.log(json);

输出的日志如下:

image.png

我们可以直接使用json,调用方式非常简单

    for(var i =0;i<json.length;i++){
            var emp = json[i];
            document.write("<h1>"+emp.empno);
            document.write(","+emp.ename);
            document.write(","+emp.job);
            document.write(","+emp.dname);
            document.write("</h1>");
            if (emp.customers != null) {
                document.write("<h2>---");
                for (var j = 0; j < emp.customers.length; j++) {
                    var customer = emp.customers[j];
                    document.write("name:"+customer.cname);
                }
                document.write("---</h2>");
            }
        }

image.png

JSON 与字符串互相转换

  • JSON.parse() 方法将字符串转换为JSON对象
  • JSON.stringify() 方法将JSON对象转换为字符串
    var str = "{\"class_name\":\"五年级\"}";//json字符串
        var j = JSON.parse(str);//json字符串转换为json对象
        console.log(str);
        console.log(j);
        console.log(j.class_name);
        var jsons = {};//json对象

        //将json对象转换为json字符串
        var s = JSON.stringify(j);
        console.log("json转字符串:"+s);

        //也可以定义一个空的json对象 根据需求进行写入
        var json2 = {};
        json2.class_name = "123";
        json2.floor = "以上";
        json2.teacher = "山东黄金";

看如下结果: 字符串 -> JSON, JSON -> 字符串

image.png

Java 使用Json

java的json工具包有FastJson Jackson Gson ….等.我们主要学习国内的:FastJSON 的安装与使用.FastJson拥有简单的API和高效率.

下载完毕后添加到 WEB-INF -> lib 目录下

image.png

创建序列化的类,FastJson给我们提供了很好的便利, 通过@JSONField 可以设置日期的格式 以及别名 和设置哪些字段不需要序列化等.

public class Employee {

    private Integer empno;

    private String ename;

    private String job;

    @JSONField(format = "yyyy-MM-dd HH:mm:ss",name = "hiredate")//FastJson 提供了对日期的格式化处理 还可以设置其他的名字
    private Date date;

    @JSONField(serialize = false) // serialize 表示不进行序列化
    private String dname;

    private Double salary;

    public Integer getEmpno() {
        return empno;
    }
    public void setEmpno(Integer empno) {
        this.empno = empno;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    public Double getSalary() {
        return salary;
    }
    public void setSalary(Double salary) {
        this.salary = salary;
    }
    @Override
    public String toString() {
        return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job + ", date=" + date + ", dname=" + dname
                + ", salary=" + salary + "]";
    }




}

通过FastJson提供了JSON类可以轻松的将对象转换为字符串,将json字符串转换为对象,代码如下: 对象的序列化和反序列化

public static void main(String[] args) {
        Employee employee = new Employee();
        employee.setEmpno(1001);
        employee.setDname("技术部");
        employee.setEname("JakePrim");
        employee.setJob("软件工程师");
        employee.setSalary(17000.0);
        Calendar calendar = Calendar.getInstance();
        calendar.set(2020, 1, 1, 12, 12);
        employee.setDate(calendar.getTime());

        //将对象转换为Json字符串
        String jsonString = JSON.toJSONString(employee);
        System.out.println(jsonString);

        //将json字符串转换为对象
        Employee employee2 = JSON.parseObject(jsonString,Employee.class);
        System.out.println(employee2.toString());
    }

接下来来看一下,数组的序列化和反序列化,代码如下: 使用非常简单,这里就不再详细讲解了,有兴趣的可以去官网查看API文档

public static void main(String[] args) {
        List<Employee> employees = new ArrayList<Employee>();

        for (int i = 0; i < 10; i++) {
            Employee employee = new Employee();
            employee.setEmpno(1001);
            employee.setDname("技术部");
            employee.setEname("JakePrim");
            employee.setJob("软件工程师");
            employee.setSalary(17000.0);
            Calendar calendar = Calendar.getInstance();
            calendar.set(2020, 1, 1, 12, 12);
            employee.setDate(calendar.getTime());

            employees.add(employee);
        }


        //将数组对象转换为Json字符串
        String jsonString = JSON.toJSONString(employees);
        System.out.println(jsonString);

        //将json字符串转换为数组对象
        List<Employee> employees2 = JSON.parseArray(jsonString, Employee.class);
        System.out.println("employees2:"+employees2.size());
    }