JSON_JavaScript Object Notation
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 值
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 对象(花括号里)
- 数组(中括号里)
- null
数字、字符串、逻辑值
案例代码
{"name": "buffer",age: 16,'gender': true
}
对象
JSON 对象在花括号中书写:
对象可以包含多个键/值对,键值对之间用逗号分隔
案例代码
{"id":001, "name":"张三", "age":18
}
数组
案例代码
{name : ["张三", '李四', '王五'],age : ["1", '2', 3],info : ['帅']
}
对象数组
- 数据使用[]包含
- 在[]都是JSON格式对象
- 每一个对象之间使用逗号隔开,同时最后一个元素不需要逗号
案例代码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.jar2、创建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 {@Testpublic void test1() {// 准备Java对象Person person = new Person("玉田", 27, true);// 获取核心类对象ObjectMapperObjectMapper 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);// 获取核心类对象ObjectMapperObjectMapper 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);// 获取核心类对象ObjectMapperObjectMapper 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;@JsonIgnoreprivate Date birthday;// Constructor、Getters and Setters、toString
}
测试类
@Test
public void test3() {// 准备Java对象Person person = new Person("玉田", 27, true);person.setBirthday(new Date());// 获取核心类对象ObjectMapperObjectMapper 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());// 获取核心类对象ObjectMapperObjectMapper 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.jar2、通过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);}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
