不冷博客

Java使用JSON知识点讲解-12月4日讲课内容

JSON

概述

JavaScript Object Notation
(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯

特点

1、存储和交换文本信息的语法,类似XML

2、轻量级(小、快)

3、可读性强(容易解析)

案例代码

{
    "firstName": "John",
    "lastName": "Smith",
    "sex": "male",
    "age": 25,
    "married": false,
    "address": 
    {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021"
    },
    "phoneNumber": 
    [
        {
          "type": "home",
          "number": "212 555-1234"
        },
        {
          "type": "fax",
          "number": "646 555-4567"
        }
    ]
}

JSON 语法【重点】

JSON 的语法基本上可以视为 JavaScript 语法的一个子集,包括以下内容:

案例代码

{
    "book": [
        {
            "id":"01",
            "language": "Java",
            "edition": "third",
            "author": "Herbert Schildt"
        },
        {
            "id":"07",
            "language": "C++",
            "edition": "second"
            "author": "E.Balagurusamy"
    }]
}

JSON 支持以下两种数据结构:

数据格式

JSON 值

数字、字符串、逻辑值

案例代码

{
    "name": "buffer",
    age: 16,
    'gender': true
}

对象

JSON 对象在花括号中书写:

对象可以包含多个键/值对,键值对之间用逗号分隔

案例代码

{
    "id":001, 
    "name":"张三", 
    "age":18
}

数组

案例代码

{
    name : ["张三", '李四', '王五'],
    age : ["1", '2', 3],
    info : ['帅']
}

对象数组

  1. 数据使用[]包含
  2. 在[]都是JSON格式对象
  3. 每一个对象之间使用逗号隔开,同时最后一个元素不需要逗号

案例代码1

{
    person1: [
        {
            "name": "张三"
        }, 
        {
            "age": 1
        }, 
        {
            "gender": true
        }
    ],
    person1: [
        {
            "name": "李四"
        }, 
        {
            "age": 2
        }, 
        {
            "gender": true
        }
    ],
    person1: [
        {
            "name": "翠花"
        }, 
        {
            "age": 3
        }, 
        {
            "gender": false
        }
    ]
}

案例代码2

{
    "person1": [
        {
            "name": "张三",
            "age": 13,
            "gender": true
        }
    ],
    "person2": [
        {
            "name": "李四",
            "age": 15,
            "gender": true
        }
    ],
    "person3": [
        {
            "name": "翠花",
            "age": 19,
            "gender": false
        }
    ]
}

JSON数据获取

1、json对象.键名

2、json对象["键名"]

3、数组对象[下标] -》 对应数组

案例代码一

var person = {"name":"张三"};

var name = person.name;
            
alert(name);

案例代码二

var person = {"name":"张三"};

var name = person["name"];

alert(name);

案例代码三

var persons = {"person" : ["张三", 16, false]};

var name = persons.person[0];

alert(name);

案例代码四

var persons = {
    "person": [{
        "name": "张三"
    }, {
        "age": 16
    }, {
        "gender": false
    }]
};

var name = persons.person[0]["name"];
var age = persons.person[1].age;

alert(name + age);

案例代码五

var person = {
    "name": "玉田",
    "age": 21
};

for (var key in person) {
    alert(key + ":" + person[key]);
}

案例代码六

var persons = [{
    "name": "老七",
    "age": 47,
    "gender": true
}, {
    "name": "永强",
    "age": 23,
    "gender": true
}, {
    "name": "刘英",
    "age": 20,
    "gender": false
}];

for (var i = 0; i < persons.length; i++) {
    var person = persons[i];

    for (var key in person) {
        alert(key + ":" + person[key]);
    }
}

JSON数据验证

JSON格式验证

JSON解析【重点】

核心操作

JSON对象转Java对象

Java对象转JSON对象

常见解析器

Gson

Jackson【常用】

Fastjson【常用】

Jackson解析

1、导包

jackson-core-2.2.3.jar
jackson-annotations-2.2.3.jar
jackson-databind-2.2.3.jar

2、创建Jackson核心类对象 ObjectMapper

3、调用相关转换方法实现解析

实体类

public class Person {
    private String name;
    private int age;
    private boolean gender;

    // Constructor、Getters and Setters、toString
}

Java对象转JSON字符串

案例代码

public class JacksonTest {
    @Test
    public void test1() {
        // 准备Java对象
        Person person = new Person("玉田", 27, true);

        // 获取核心类对象ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        try {
            // 将Java对象转为Json字符串
            String jsonString = mapper.writeValueAsString(person);

            System.out.println(jsonString);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

集合转JSON字符串

案例代码

@Test
public void test2() {
    // 准备Java对象
    Person person1 = new Person("玉田", 51, true, new Date());
    Person person2 = new Person("永强", 34, true, new Date());
    Person person3 = new Person("大脚", 29, false, new Date());

    // 声明一个集合并将数据添加到集合中
    List<Person> list = new ArrayList<>();
    list.add(person1);
    list.add(person2);
    list.add(person3);

    // 获取核心类对象ObjectMapper
    ObjectMapper mapper = new ObjectMapper();

    try {
        // 将集合转为Json字符串
        String jsonString = mapper.writeValueAsString(list); // [{"name":"玉田","age":51,"gender":true,"birthday":"2020-12-01 15:46:46"},{"name":"永强","age":34,"gender":true,"birthday":"2020-12-01 15:46:46"},{"name":"大脚","age":29,"gender":false,"birthday":"2020-12-01 15:46:46"}]

        System.out.println(jsonString);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

Map转JSON字符串

案例代码

@Test
public void test4() {
    // 准备Java对象
    Person person1 = new Person("玉田", 51, true, new Date());
    Person person2 = new Person("永强", 34, true, new Date());
    Person person3 = new Person("大脚", 29, false, new Date());

    // 声明一个集合并将数据添加到集合中
    Map<String, Person> map = new HashMap<>();
    map.put("person1", person1);
    map.put("person2", person2);
    map.put("person3", person3);

    // 获取核心类对象ObjectMapper
    ObjectMapper mapper = new ObjectMapper();

    try {
        // 将Map转为Json字符串
        String jsonString = mapper.writeValueAsString(map); // {"person3":{"name":"大脚","age":29,"gender":false,"birthday":"2020-12-01 15:51:02"},"person2":{"name":"永强","age":34,"gender":true,"birthday":"2020-12-01 15:51:02"},"person1":{"name":"玉田","age":51,"gender":true,"birthday":"2020-12-01 15:51:02"}}

        System.out.println(jsonString);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

JSON字符串转Java对象【用的不多】

案例代码

@Test
public void test6() {
    String jsonString = "{\"name\":\"玉田\", \"age\":21, \"gender\":true}";

    ObjectMapper mapper = new ObjectMapper();

    try {
        Person person = mapper.readValue(jsonString, Person.class);

        System.out.println(person); // Person{name='玉田', age=21, gender=true, birthday=null}
    } catch (IOException e) {
        e.printStackTrace();
    }
}

补充:两个注解的使用

// 被此注解修饰的变量不会进行Json格式的转换
@JsonIgnore

// 被此注解修饰的变量会被格式化
@JsonFormat

案例代码一:@JsonIgnore

实体类

public class Person {
    private String name;
    private int age;
    private boolean gender;
    @JsonIgnore
    private Date birthday;

    // Constructor、Getters and Setters、toString
}

测试类

@Test
public void test3() {
    // 准备Java对象
    Person person = new Person("玉田", 27, true);
    person.setBirthday(new Date());

    // 获取核心类对象ObjectMapper
    ObjectMapper mapper = new ObjectMapper();

    try {
        // 将Java对象转为Json字符串
        String jsonString = mapper.writeValueAsString(person);

        System.out.println(jsonString); // {"name":"玉田","age":27,"gender":true}
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

案例代码二:@JsonFormat

实体类

public class Person {
    private String name;
    private int age;
    private boolean gender;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;

    // Constructor、Getters and Setters、toString
}

测试类

@Test
public void test3() {
    // 准备Java对象
    Person person = new Person("玉田", 27, true);
    person.setBirthday(new Date());

    // 获取核心类对象ObjectMapper
    ObjectMapper mapper = new ObjectMapper();

    try {
        // 将Java对象转为Json字符串
        String jsonString = mapper.writeValueAsString(person);

        System.out.println(jsonString); // {"name":"玉田","age":27,"gender":true,"birthday":"2020-12-01 15:37:31"}
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

FastJson 解析

1、导包

fastjson-1.2.47.jar

2、通过JSON核心类调用解析和转换方法

Java对象转为Json字符串

@Test
public void test1() {
    // 准备实体类对象
    Person person = new Person("玉田", 21, true, new Date());

    // Java对象转为Json字符串
    String jsonString = JSON.toJSONString(person);

    System.out.println(jsonString); // {"age":21,"birthday":1606839584000,"gender":true,"name":"玉田"}
}

集合转为Json字符串

@Test
public void test2() {
    // 准备Java对象
    Person person1 = new Person("玉田", 51, true, new Date());
    Person person2 = new Person("永强", 34, true, new Date());
    Person person3 = new Person("大脚", 29, false, new Date());

    // 声明一个集合并将数据添加到集合中
    List<Person> list = new ArrayList<>();
    list.add(person1);
    list.add(person2);
    list.add(person3);
    // Java对象转为Json字符串
    String jsonString = JSON.toJSONString(list);

    System.out.println(jsonString); // [{"age":51,"birthday":1606840178091,"gender":true,"name":"玉田"},{"age":34,"birthday":1606840178091,"gender":true,"name":"永强"},{"age":29,"birthday":1606840178091,"gender":false,"name":"大脚"}]
}

Json字符串转Java对象

@Test
public void test3() {
    // 准备Json字符串
    String jsonString = "{\"age\":21,\"birthday\":1606839584000,\"gender\":true,\"name\":\"玉田\"}";

    // 将Json字符串解析成实体类对象
    Person person = JSON.parseObject(jsonString, Person.class);

    System.out.println(person);
}

Json字符串转Json对象

@Test
public void test4() {
    // 准备Json字符串
    String jsonString = "{\"age\":21,\"birthday\":1606839584000,\"gender\":true,\"name\":\"玉田\"}";

    // 将Json字符串转为Json对象
    JSONObject jsonObject = JSON.parseObject(jsonString);

    System.out.println(jsonObject);

    // 根据键获取对应的值
    String name = jsonObject.getString("name");
    System.out.println(name);
    System.out.println(jsonObject.getInteger("age"));
}

Json字符串转Json数组

@Test
public void test5() {
    // 准备Json字符串
    String jsonString = "[{\"age\":51,\"birthday\":1606840178091,\"gender\":true,\"name\":\"玉田\"},{\"age\":34," +
            "\"birthday\":1606840178091,\"gender\":true,\"name\":\"永强\"},{\"age\":29,\"birthday\":1606840178091," +
            "\"gender\":false,\"name\":\"大脚\"}]";

    // Json字符串转Json数组
    JSONArray objects = JSON.parseArray(jsonString);
    System.out.println(objects);

    // 增强for循环获取所有的Json对象
    for (Object object : objects) {
        // 强制类型转换
        JSONObject jsonObject1 = (JSONObject) object;

        // 根据键获取对应的值
        System.out.println(jsonObject1.getString("name"));
        System.out.println(jsonObject1.getInteger("age"));
    }

    // 获取Json数组中指定下标位置的java对象
    Person person = objects.getObject(2, Person.class);
    System.out.println(person);
}

Json数组转集合

@Test
public void test6() {
    // 准备Json字符串
    String jsonString = "[{\"age\":51,\"birthday\":1606840178091,\"gender\":true,\"name\":\"玉田\"},{\"age\":34," +
            "\"birthday\":1606840178091,\"gender\":true,\"name\":\"永强\"},{\"age\":29,\"birthday\":1606840178091," +
            "\"gender\":false,\"name\":\"大脚\"}]";

    // Json字符串转Json数组
    JSONArray objects = JSON.parseArray(jsonString);

    // 讲Json数组转为集合
    List<Person> list = objects.toJavaList(Person.class);

    // 增强for循环拿到所有的对象
    for (Person person : list) {
        System.out.println(person);
    }
}

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »