前言
- JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格局,目前应用特地宽泛。
- 采纳齐全独立于编程语言的 文本格式 来存储和示意数据。
- 简洁和清晰的层次结构使得 JSON 成为现实的数据交换语言。
- 易于人浏览和编写,同时也易于机器解析和生成,并无效地晋升网络传输效率。
在 JavaScript 语言中,一切都是对象。因而,任何 JavaScript 反对的类型都能够通过 JSON 来示意,例如字符串、数字、对象、数组等。看看他的要求和语法格局:
- 对象示意为键值对,数据由逗号分隔
- 花括号保留对象
- 方括号保留数组
JSON 键值对 是用来保留 JavaScript 对象的一种形式,和 JavaScript 对象的写法也大同小异,键 / 值对组合中的键名写在后面并用双引号“”包裹,应用冒号 : 分隔,而后紧接着值:
{"name": "xiaotang"}
{"age": "18"}
{"sex": "男"}
很多人搞不清楚 JSON 和 JavaScript 对象的关系,甚至连谁是谁都不分明。其实,能够这么了解:
JSON 是 JavaScript 对象的字符串表示法,它应用文本示意一个 JS 对象的信息,实质是一个字符串。
var obj = {a: 'Hello', b: 'World'}; // 这是一个对象,留神键名也是能够应用引号包裹的
var json = '{"a":"Hello","b":"World"}'; // 这是一个 JSON 字符串,实质是一个字符串
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"}'
测试案例
前端界面显示 JSON 数据
**1. 新建一个 springboot 我的项目
2. 在模本引擎目录先新建个 json-1.html,编写测试内容 **
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript">
// 编写一个 js 的对象
var user = {
name:"殷飞龙",
age:3,
sex:"男"
};
// 将 js 对象转换成 json 字符串
var str = JSON.stringify(user);
console.log(str);
// 将 json 字符串转换为 js 对象
var user2 = JSON.parse(str);
console.log(user2.age,user2.name,user2.sex);
</script>
</body>
</html>
3. 在 IDEA 中应用浏览器关上,查看控制台输入!
管制层 Controller 返回 JSON 数据:
Jackson 应该是目前比拟好的 json 解析工具了
当然工具不止这一个,比方还有阿里巴巴的 fastjson 等等。
咱们这里应用 Jackson,应用它须要导入它的 jar 包;
SpringBoot 不必引入依赖会显示无奈关上 tomacat 次要问题 jar 包抵触
这里咱们须要两个新货色,一个是 @ResponseBody,一个是 ObjectMapper 对象,咱们看下具体的用法
1. 编写一个 User 的实体类,而后咱们去编写咱们的测试 Controller;
public class User {
private String name;
private int age;
private String sex;
public User() {}
public User(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
public String getSex() {return sex;}
public void setSex(String sex) {this.sex = sex;}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
2. 编写一个 Controller
import com.example.demojson.pojo.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 启动能够扫描的到 Controller 的注解类
public class UserController {@RequestMapping("/json1")
@ResponseBody
public String json1() throws JsonProcessingException {
// 创立一个 jackson 的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
// 创立一个对象
User user = new User("殷飞龙", 18, "男");
// 将咱们的对象解析成为 json 格局
String str = mapper.writeValueAsString(user);
// 因为 @ResponseBody 注解,这里会将 str 转成 json 格局返回;非常不便
return str;
}
}
3. 输入后果:
返回 json 字符串对立解决
在类上间接应用 @RestController,这样子,外面所有的办法都只会返回 json 字符串了,不必再每一个都增加 @ResponseBody!咱们在前后端拆散开发中,个别都应用 @RestController,非常便捷。
测试汇合输入
@RequestMapping("/json2")
public String json2() throws JsonProcessingException {
// 创立一个 jackson 的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
// 创立一个对象
User user1 = new User("殷飞龙 1 号", 18, "男");
User user2 = new User("殷飞龙 2 号", 18, "男");
User user3 = new User("殷飞龙 3 号", 19, "男");
User user4 = new User("殷飞龙 4 号", 20, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
// 将咱们的对象解析成为 json 格局
String str = mapper.writeValueAsString(list);
return str;
}
输入工夫对象
// 输入工夫对象
@RequestMapping("/json3")
public String json3() throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();
// 创立工夫一个对象,java.util.Date
Date date = new Date();
// 将咱们的对象解析成为 json 格局
String str = mapper.writeValueAsString(date);
return str;
}
输入后果:
- 显示的数字的具体信息
- 默认日期格局会变成一个数字,是 1970 年 1 月 1 日到以后日期的毫秒数!
- Jackson 默认是会把工夫转成 timestamps 模式
解决方案:勾销 timestamps 模式,自定义工夫格局
@RequestMapping("/json4")
@ResponseBody
public String json4() throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();
// 不应用工夫戳的形式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// 自定义日期格局对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 指定日期格局
mapper.setDateFormat(sdf);
Date date = new Date();
String str = mapper.writeValueAsString(date);
return str;
}
工夫显示胜利
抽取为工具类
创立一个 util 包外面寄存一些工具类,缩小代码的复杂度、反复度
package com.example.demojson.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
public class JsonUtils {public static String getJson(Object object) {return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
public static String getJson(Object object,String dateFormat) {ObjectMapper mapper = new ObjectMapper();
// 不应用时间差的形式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// 自定义日期格局对象
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
// 指定日期格局
mapper.setDateFormat(sdf);
try {return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {e.printStackTrace();
}
return null;
}
}
测试代码:一样的成果极大的简化
@RequestMapping("/json5")
@ResponseBody
public String json5() throws JsonProcessingException {Date date = new Date();
String json = JsonUtils.getJson(date);
return json;
}
输入后果:
最初
大家看完有什么不懂的能够在下方留言探讨,也能够关注我私信问我,我看到后都会答复的。也欢送大家关注我的公众号:前程有光,马上金九银十跳槽面试季,整顿了 1000 多道将近 500 多页 pdf 文档的 Java 面试题材料放在外面,助你圆梦 BAT!文章都会在外面更新,整顿的材料也会放在外面。谢谢你的观看,感觉文章对你有帮忙的话记得关注我点个赞反对一下!