一、什么是JSON?
- 概念:JavaScript Object Notation (JavaScript 对象表示法)
- JSON 是存储和交换文本信息的语法。类似 XML。
- JSON 比 XML 更小、更快,更易解析。
- json实例:
//实例1:
var person = {"name":"张三","age":23,"gender":"男"}
//实例2:
{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}
//这个 sites 对象是包含 3 个站点记录(对象)的数组。
二、语法
1、基本规则
- 数据在名称/值对中 :json数据是由键值对构成的
- 键用引号(单双都行)引起来,也可以不使用引号
- 值得取值类型:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中) 如:上述实例2.
- 对象(在大括号中) 如:{“address”:{“province”:”山西”,……}}
- null
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
2、获取数据
- json对象.键名
- json对象[“键名”]
案例:
var p = {"name":"李四","age":18,"gender":"男"};
//var name = p.name;
var name1 = p["name"];
alert(name1);
var persons = {"persons":[
{"name":"李四","age":18,"gender":"男"},
{"name":"张三","age":22,"gender":"男"},
{"name":"王五","age":18,"gender":"男"}]};
// var name2 = persons.persons[1].name;
var name3 = persons.persons[1]["name"];
alert(name3);
var ps = [{"name":"李四","age":18,"gender":"男"},
{"name":"张三","age":22,"gender":"男"},
{"name":"王五","age":18,"gender":"男"}];
var name4 = ps[2].name;
alert(name4)
3、遍历json对象
for in 循环
//案例一
var p = {"name":"李四","age":18,"gender":"男"};
for(var key in p){
alert(key)
// alert(key + p.key) //p.key不能获取值,因为相当于p."name"...
}
//案例二
var ps = [{"name":"李四","age":18,"gender":"男"},
{"name":"张三","age":22,"gender":"男"},
{"name":"王五","age":18,"gender":"男"}];
for(var i = 0;i<ps.length;i++){
var p = ps[i];
for(var key in p){
alert(key)
}
}
三、JSON数据和Java对象的相互转换
1、JSON解析器
- 常见的解析器:Jsonlib,Gson,fastjson,jackson。(学习jackson解析器)
2、Java对象转换为JSON
- 使用步骤:
- 导入jackson的相关jar包
- 创建jackson核心对象 ObjectMapper
- 调用ObjectMapper的相关方法进行转换
- 转换方法:
- writeValue(参数1,obj)
- 参数1:
- File:将obj转换为json字符串,并报存到指定的文件
- Writer:将obj转换为json字符串,并将json数据填充到字符输出流中
- OutputStream:将obj转换为json字符串,并将json数据填充到字节输出流中
- 参数1:
- writeValueAsString(obj):将对象转换为json字符串
- writeValue(参数1,obj)
- 注解
- @JsonIgnore:排除属性
- @JsonFormat:属性值的格式化
- 复杂java对象转换(方法一样)
- List
- Map
- 转换方法:
//java对象转换Json
@Test
public void test1() throws Exception {
//1.创建Java对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
//2.创建Jackson核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3.转换
//方法一: mapper.writeValueAsString();
//String json = mapper.writeValueAsString(p);
//System.out.println(json); // {"name":"张三","age":23,"gender":"男"}
//方法二:writeValue(参数1,obj)
//将json数据写到d://a.txt文件中
//mapper.writeValue(new File("d://a.txt"),p);
//将json数据关联到writer中
mapper.writeValue(new FileWriter("d://b.txt"),p);
}
注解的使用
//注解的使用
package domain;
public class Person {
// @JsonIgnore //排除属性
@JsonFormat(pattern = "yyyy-MM-dd hh:DD:ss")
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
package test;
public class JacksonTest {
@Test
public void test2() throws Exception {
//1.创建Java对象
Person p = new Person();
p.setBirthday(new Date());
//创建jackson核心对象
ObjectMapper mapper = new ObjectMapper();
//转换
String json = mapper.writeValueAsString(p);
System.out.println(json);//不加注解的值 {"birthday":1584021428833}
//加@JsonFormat注解 获取的值{"birthday":"2020-03-12 01:72:17"}
}
}
3、JSON转换为Java对象
- 使用步骤:
- 导入jackson的相关jar包
- 创建jackson核心对象 ObjectMapper
- 调用ObjectMapper的相关方法进行转换
- 转换方法:
- readValue(json字符串数据, Class)
- 转换方法:
//json转换为Java对象
@Test
public void test3() throws Exception {
//1.初始化Json字符串
String json = "{\"name\":\"张三\",\"age\":23,\"gender\":\"男\"}";
//创建jsckson核心对象ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3.转换
Person person = mapper.readValue(json, Person.class);
System.out.println(person);
}
案例扩展
服务器响应的数据,在客户端使用时,要想当作json数据格式使用的方法
- 使用$.get()或$.post()获取服务器端数据时,可以设置方法的type参数类型
- 在服务器端设置MIME类型
response.setContentType("application/json;charset=utf-8");