JSON语法和解析器

1.基本概念

  • JavaScript对象表示法 Javascript Object Notation
  • json现在多用于存储和交换文本信息的语法
  • 进行数据的传输
  • json比XML更小、更快、更易解析

2.语法

  1. 基本规则
    • 数据在名称/值对中:json数据由键值对构成。
      1. 键用单/双引号引起,也可以不使用;
      2. 值的取值类型
        • 数字(整数或浮点数)
        • 字符串(双引号)
        • 逻辑值(true或false)
        • 数组(在方括号中) {“Person”:[{ },{ }….]}
        • 对象 {“address”:{“province”:”陕西”…}}
        • null
    • 数据由逗号隔开:多个键值对由都好分隔
    • 花括号保存对象:使用{}定义json格式
    • 方括号保存数组:[]
  2. 获取数据
    • json对象.键名
    • json对象[“键名”]
    • 数组对象[索引]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<script>
//定义基本格式
var person = {"name": "hxx", "age": 20, "gender": true};
//获取person的所有键和值
for (let personKey in person) {
alert(personKey+":"+person[personKey]);
//alert(person.personKey);//这种方式不能正确获取,因为personKey是字符串形式"name",person.personKey相当于person."name"
}
//获取name
alert(person.name);
alert(person["name"]);

//嵌套格式
var persons = {
"persons": [
{"name": "hxx", "age": 20},
{"name": "qzy", "age": 20}
]
};
var ps = persons.persons;
for (let i = 0; i < ps.length; i++) {
var p = ps[i];
for (let pKey in p) {
alert(pKey+":"+ p[pKey]);
}
}
alert(persons.persons[1].name);

var ps = [
{"name": "hxx", "age": 20},
{"name": "qzy", "age": 20}
];
for (let i = 0; i < ps.length; i++) {
var p = ps[i];
for (let pKey in p) {
alert(pKey+":"+ p[pKey]);
}
}
alert(ps[1].name);
</script>

3.json数据和Java对象的相互转换

3.1 Java对象转换为json对象

转换核心对象ObjectMapper的转换方法:

  1. writeValue(参数1,obj)

        参数1:
             File:将obj对象转换为json字符串,并保存到指定文件中
             Writer:将json字符串填充到字符输出流中
             OutputStream:将json字符串填充到字节输出流中
  2. writeValueAsString(obj)转换为json字符串

注解

  1. @JsonIgnore //转换成json对象时忽略该属性

  2. @JsonFormat:属性值格式化

    @JsonFormat(pattern = “yyyy-MM-dd”)

复杂Java对象转换

  1. List:数组
  2. Map:对象格式一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class JacksonTest {
@Test
public void test1() throws IOException {
//创建Person对象
Person person = new Person();
person.setAge(20);
person.setName("hxx");
person.setBirthday(new Date());
//创建Jackson核心对象
ObjectMapper objectMapper = new ObjectMapper();

String json = objectMapper.writeValueAsString(person);
//{"name":"hxx","age":20,"birthday":"2021-03-30"}
System.out.println(json);//{"name":"hxx","age":20}
//将数据写到a.txt中
objectMapper.writeValue(new File("a.txt"),person);

Person p1 = new Person();
p1.setName("张三");
p1.setAge(10);
p1.setBirthday(new Date());

List<Person> list = new ArrayList<Person>();
list.add(person);
list.add(p1);
String asString = objectMapper.writeValueAsString(list);
//[{"name":"hxx","age":20,"birthday":"2021-03-30"},{"name":"张三","age":10,"birthday":"2021-03-30"}]
System.out.println(asString);

Map<String,Object> map = new HashMap<String, Object>();
map.put("name","hxx");
map.put("age",20);
String s = objectMapper.writeValueAsString(map);
//{"name":"hxx","age":20}
System.out.println(s);
}
}

3.2json对象转换为Java对象

转换核心对象ObjectMapper的转换方法:

  1. readValue(json字符串,Class)
1
2
3
4
5
6
7
8
9
@Test
public void test2() throws JsonProcessingException {
//初始化json字符串
String json = "{\"name\":\"hxx\",\"age\":20,\"birthday\":\"2021-03-30\"}";
//创建ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person);
}