🐱🏍目录
JSON 概述
1. 什么是 JSON
- JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
- 采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
- 对象表示为键值对,数据由逗号分隔
- 花括号保存对象 {}
- 方括号保存数组 []
JSON 键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:
{"name": "QinJiang"}
{"age": "3"}
{"sex": "男"}
很多人搞不清楚 JSON 和 JavaScript 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串:
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
2. JSON 和 JavaScript 对象互转
要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}
要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'
代码测试:
创建一个 index.html,并在浏览器控制台测试:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
hello
<script type="text/javascript">
// 对象
var user={name:"yxs",age:20,sex:"man"};
// 输出对象
console.log(user);
// js对象转字符串
var str=JSON.stringify(user);
console.log(str);
// 字符串转对象
var obj=JSON.parse(str);
</script>
</body>
</html>
Controller返回JSON数据
-
Jackson应该是目前比较好的json解析工具了
-
当然工具不止这一个,比如还有阿里巴巴的 fastjson 等等。
-
这里使用Jackson,使用它需要导入它的jar包;
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
随便编写一个User的实体类,然后我们去编写我们的测试Controller:
package com.example.review2.model;
import lombok.Data;
@Data
public class User {
private Integer age;
private String name;
private String sex;
public User() {
}
public User(Integer age, String name, String sex) {
this.age = age;
this.name = name;
this.sex = sex;
}
}
1. 使用Jackson返回 json 对象 (详情见代码注释)
@Controller
@ResponseBody
public class UserController {
// 正常返回的话会走视图解析器,而json需要返回的是一个字符串
// 市面上有很多的第三方jar包可以实现这个功能,比如Jackson,只需要一个简单的注解就可以实现了
// @ResponseBody 将服务端返回的对象转换为json对象响应回去
@RequestMapping("/json1")
public String json1() throws JsonProcessingException {
// 需要一个Jackson的对象映射器,其实就是一个类,使用他可以直接将对象转换为json字符串
ObjectMapper objectMapper=new ObjectMapper();
// 创建一个对象
User user=new User(18,"mike","man");
System.out.println(user);
//将Java对象转换为json字符串
String str= objectMapper.writeValueAsString(user);
System.out.println(str);
return str;// 由于使用了 @ResponseBody 注解,这里会将str以json格式的字符串返回,十分方便
}
}
2. 使用Jackson返回 json 对象数组
@RequestMapping("/json2")
public String json2() throws JsonProcessingException {
List<User> userList=new ArrayList<>();
User user1=new User(19,"hasdkh","man");
User user2=new User(19,"hassaasddkh","man");
User user3=new User(19,"hasasdasdasdsadkh","man");
userList.add(user1);
userList.add(user2);
userList.add(user3);
return objectMapper.writeValueAsString(userList);
}
3. 使用 Jackson 返回时间(默认返回的是时间戳格式)
@RequestMapping("/time1")
public String json4() throws JsonProcessingException {
Date date=new Date();
System.out.println(date);
// 时间默认返回的json字符串为时间戳格式(TimeStamp)
return objectMapper.writeValueAsString(date);
}
4. 配置 mapper config 返回时间格式为自定义的时间格式
@RequestMapping("/time2")
public String json5() throws JsonProcessingException {
Date date=new Date();
// 时间默认返回的json字符串为时间戳格式(TimeStamp)
// 为了让objectMapper 不返回时间戳,关闭它的时间戳功能
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
// 时间格式化时用自定义日期格式对象
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 让mapper指定时间日期格式为 simpleDateFormat
objectMapper.setDateFormat(simpleDateFormat);
return objectMapper.writeValueAsString(date);
}
5. 对重复代码进行抽取封装,形成json工具类
public class JsonTool {
public static String getJson(Object object){
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
public static String getJson(Object object,String dateFormat){
ObjectMapper objectMapper=new ObjectMapper();
// 关闭时间戳
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
// 自定义日期对象格式
SimpleDateFormat simpleDateFormat=new SimpleDateFormat(dateFormat);
// mapper指定日期格式为 simpleDateFormat
objectMapper.setDateFormat(simpleDateFormat);
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
这样使用一行代码就可以实现上面多行代码实现的功能了,大大简化开发啊:
@RequestMapping("/time3")
public String json6() {
return JsonTool.getJson(new Date());
}
掌握这篇博客内容就可以掌握我们Java程序猿所需要的json知识了!
建议多看多练习!
类似Jackson这种工具类,我们只需要掌握使用就好了,在使用的时候在根据具体的业务去找对应的实现;类似Jackson这个工具类,还有阿里巴巴提供的 fastjson,在实现效果上是和Jackson一样的,只需要掌握一种就行,这里博主觉得Jackson使用挺方便的,就不介绍fastjson了,如果需要学习可以自行百度!
FastJson 使用示例:
诸如 Jackson 与 Fastjson 这样的解析json 的工具类,我们只要掌握如何使用api即可,fastjson使用示例代码如下:
1. 解析Java对象为json字符串
package com.yxs.dao.utils;
import com.alibaba.fastjson.JSONObject;
import com.yxs.entity.UserEntity;
import java.util.ArrayList;
public class FastJsonTest {
public static void main(String[] args) {
UserEntity user1=new UserEntity(1,"张三","111"); // 构造user对象
UserEntity user2=new UserEntity(2,"李四","222");
// 1. 将user对象转换为json字符串
String uJson1= JSONObject.toJSONString(user1);
System.out.println(uJson1);
// 2. 嵌套json示例
JSONObject jsonObject=new JSONObject();
jsonObject.put("status",200);
jsonObject.put("msg","ok");
ArrayList<UserEntity> arrayList=new ArrayList<>();
arrayList.add(user1);
arrayList.add(user2);
jsonObject.put("data",arrayList);
String manyJson=jsonObject.toJSONString();
System.out.println(manyJson);
}
}
2. 嵌套json 示例
解析json字符串代码示例:
// string 对象转 json 对象
String jsonStr="{\"msg\":\"ok\",\"data\":[{\"id\":1,\"password\":\"111\",\"userName\":\"张三\"},{\"id\":2,\"password\":\"222\",\"userName\":\"李四\"}],\"status\":200}";
JSONObject jsonObject2=JSONObject.parseObject(jsonStr);
Integer status=jsonObject2.getInteger("status");
String msg=jsonObject2.getString("msg");
System.out.println(status);
System.out.println(msg);
JSONArray data=jsonObject2.getJSONArray("data");
for (int i = 0; i < data.size(); i++) {
JSONObject object=(JSONObject)data.get(i);
Integer id=object.getInteger("id");
String username=object.getString("userName");
String password=object.getString("password");
// 还原对象
UserEntity userEntity=new UserEntity(id,username,password);
System.out.println(userEntity);
3. Java序列化技术,将json变为Java对象(项目中常用,重点掌握)
// Java序列化技术,将json变为Java对象(项目中常用,重点掌握)
JsonModel jsonModel= JSONObject.parseObject(jsonStr,JsonModel.class);
System.out.println(jsonModel);
jsonModel 类:
package com.yxs.entity;
import java.util.List;
public class JsonModel {
private Integer status;
private String msg;
private List<UserEntity> data;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<UserEntity> getLists() {
return data;
}
public void setLists(List<UserEntity> lists) {
this.data = lists;
}
public List<UserEntity> getData() {
return data;
}
public void setData(List<UserEntity> data) {
this.data = data;
}
@Override
public String toString() {
return "JsonModel{" +
"status=" + status +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
解析成功 :
fastjson 练习代码附上:
package com.yxs.dao.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yxs.entity.JsonModel;
import com.yxs.entity.UserEntity;
import java.util.ArrayList;
public class FastJsonTest {
public static void main(String[] args) {
UserEntity user1=new UserEntity(1,"张三","111"); // 构造user对象
UserEntity user2=new UserEntity(2,"李四","222");
// 1. 将user对象转换为json字符串
String uJson1= JSONObject.toJSONString(user1);
System.out.println(uJson1);
// 2. 嵌套json示例
JSONObject jsonObject=new JSONObject();
jsonObject.put("status",200);
jsonObject.put("msg","ok");
ArrayList<UserEntity> arrayList=new ArrayList<>();
arrayList.add(user1);
arrayList.add(user2);
jsonObject.put("data",arrayList);
String manyJson=jsonObject.toJSONString();
System.out.println(manyJson);
System.out.println("-------------------------i am fenGe-----------------------------------");
// string 对象转 json 对象
String jsonStr="{\"msg\":\"ok\",\"data\":[{\"id\":1,\"password\":\"111\",\"userName\":\"张三\"},{\"id\":2,\"password\":\"222\",\"userName\":\"李四\"}],\"status\":200}";
JSONObject jsonObject2=JSONObject.parseObject(jsonStr);
Integer status=jsonObject2.getInteger("status");
String msg=jsonObject2.getString("msg");
System.out.println(status);
System.out.println(msg);
JSONArray data=jsonObject2.getJSONArray("data");
for (int i = 0; i < data.size(); i++) {
JSONObject object=(JSONObject)data.get(i);
Integer id=object.getInteger("id");
String username=object.getString("userName");
String password=object.getString("password");
// 还原对象
UserEntity userEntity=new UserEntity(id,username,password);
System.out.println(userEntity);
System.out.println("-------------------------i am fenGe 2-----------------------------------");
// Java序列化技术,将json变为Java对象(项目中常用,重点掌握)
JsonModel jsonModel= JSONObject.parseObject(jsonStr,JsonModel.class);
System.out.println(jsonModel);
}
}
}