JSON快速入门【使用Jackson解析器】
1、json的概念:JavaScript 对象表示法(JavaScript Object Notation)
Student s = new Student();
s.setName="张三";
s.setAge=20;
s.setSex="男";
- 1.1 举例:var student={"name": "张三", age: 23, 'gender': true};
- 1.2 作用:
* JSON 是存储和交换文本信息的语法。类似 XML;
* JSON 比 XML 更小、更快,更易解析;
* 进行数据的传输;
* JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
2、语法
- 2.1 基本规则:
# 数据在“键值对”中:json数据有键值对构成;
* 键用引号【单双引号都可以】引起来,也可以不用引号;
举例:var student={"name": "张三", age: 23, 'gender': true};
* 值可以取得的类型是:
1.数字(整数或浮点数)
2.字符串(在双引号中)
3.逻辑值(true 或 false)
4.数组(在方括号中){"student":[{},{}]}
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}
]
};
alert("数据格式:"+persons);
5.对象(在花括号中){"address":{"province":"河南"....}}
6.null
# 数据由逗号分隔:多个键值对由逗号分隔;
# 花括号保存对象:使用{}定义json格式
# 方括号保存数组:[]
2.2 获取数据:
* json对象.键名 alert("第一种:"+student.name);
* json对象["键名"] alert("第二种:"+student['name']);
* 数组对象[索引]
* 遍历
//基本格式
var ps={"name": "张三", age: 23, 'gender': true};
//复杂格式
var ps2= [{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}];
//获取ps对象中所有的键和值
//for in 循环
for(var key in ps){
alert(key+":"+ps[key]);
}
//获取ps中的所有值
for (var i = 0; i < ps2.length; i++) {
var p = ps2[i];
for(var key in p){
alert(key+":"+p[key]);
}
}
3、JSON数据和Java对象的相互转换
# JSON解析器
* 常见的解析器:
fastjson【阿里巴巴】、jackson【springMVC内置的解析器】
Jsonlib【官方出品】、Gson【谷歌提供】
3.1 Java对象转为JSON
# 使用步骤:
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
3. 调用ObjectMapper的相关方法进行转换
1. 转换方法:
# writeValue(参数1,obj):
* 参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
# writeValueAsString(obj):将对象转为json字符串
* 举例:
@Test
public void test1() throws Exception {
//1.创建Student对象
Student s = new Student();
s.setName("张三");
s.setAge(23);
s.setSex('男');
//2.创建Jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3.转换
//writeValue,将数据写到d://a.txt文件中
mapper.writeValue(new File("d://a.txt"),s);
//writeValue.将数据关联到Writer中
mapper.writeValue(new FileWriter("d://b.txt"),s);
//将s对象转化为json写到输出流中响应到前端
//mapper.writeValue(response.getOutputStream(),s);
String json = mapper.writeValueAsString(s);
//JSON格式:{"name":"张三","age":23,"gender":"男"}
System.out.println(json);
}
2. 注解:
1. @JsonIgnore:排除属性。
2. @JsonFormat:属性值得格式化
@JsonFormat(pattern = "yyyy-MM-dd")
* 举例:
@Test
public void test2() throws Exception {
//1.创建Person对象
Student s = new Student();
s.setName("张三");
s.setAge(23);
s.setSex('男');
s.setBirthday(new Date());
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(s);
System.out.println(json);
}
3. 复杂java对象转换
1. List:数组
# 举例:
@Test
public void test3() throws Exception {
//1.创建Person对象
Student s = new Student();
s.setName("张三");
s.setAge(23);
s.setSex('男');
s.setBirthday(new Date());
Student s1 = new Student();
s1.setName("李四");
s1.setAge(24);
s1.setSex('女');
s1.setBirthday(new Date());
Student s2 = new Student();
s2.setName("王五");
s2.setAge(25);
s2.setSex('男');
s2.setBirthday(new Date());
//创建List集合
List<Student> ps = new ArrayList<Student>();
ps.add(s);
ps.add(s1);
ps.add(s2);
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(ps);
System.out.println(json);
}
2. Map:对象格式一致
# 举例:
@Test
public void test4() throws Exception {
//1.创建map对象
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","张三");
map.put("age",23);
map.put("sex","男");
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(map);
System.out.println(json);
}
3.2 JSON转化为java对象
# 使用步骤
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
3. 调用ObjectMapper的相关方法进行转换
1. readValue(json字符串数据,Class)
# 举例:
@Test
public void test5() throws Exception {
//1.初始化JSON字符串
String json = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":23}";
//2.创建ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
//3.转换为Java对象 Person对象
Student stu = mapper.readValue(json, Student.class);
System.out.println(stu);
}
4、测试web及使用工具类
-------------------- servlet编写-------------------------------
@WebServlet("/jsonServlet")
public class JsonServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Person对象
Student s = new Student();
s.setName("张三");
s.setAge(23);
s.setSex('男');
s.setBirthday(new Date());
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(s);
System.out.println(json);
//使用工具类
//String stu = JsonUtil.writeValueAsString(s);
//System.out.println(stu);
//3、响应
//设置json响应格式
response.setContentType("application/json;charset=utf-8");
//美化json
//mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.writeValue(response.getOutputStream(), s);
//使用工具类
JsonUtil.writeValue(s, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
--------------------------------jsp------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试json</title>
</head>
<body>
<a href="<%=request.getContextPath() %>/jsonServlet">点击</a>
</body>
</html>
【注意】 服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
1. $.get或者post(type):将最后一个参数type指定为"json"
2. 在服务器端设置MIME类型
response.setContentType("application/json;charset=utf-8");
3.3 美化json
mapper.enable(SerializationFeature.INDENT_OUTPUT);
* 在火狐浏览器中会自动美化json;
* 在谷歌浏览器中不会可通过上述代码完成;