什么是JSON
前后端分离时代:
后端部署后端,提供接口,提供数据
JSON
前端独立部署,负责渲染后端的数据
JSON就好像桥梁一样链接着前后端的数据
1:简介:
1:JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。
2:采用完全独立于编程语言的文本格式来存储和表示数据。
3:简洁和清晰的层次结构使得JSON成为理想的数据交换语言。
4:易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在JavaScript语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
- 对象表示为键值对,数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
2:JSON键值对
JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号” “包裹,使用冒号∶分隔,然后紧接着值:
{“name”:”幺鸡”}
{“age”:”18”}
{“sex”:”男”}
很多人搞不清楚JSON和JavaScript对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
- JSON是JavaScript对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。
Var obj = {a : ”hello”, b : “word”}; //这是一个对象,注意简明也是可以用引号包裹的
Var json = ‘{“a” : “hello”, “b”: “word”}’; //这是一个JSON字符串,本质就是一个字符串。
JSON和JavaScript对象转换
- 要想实现JSON字符串转换成JavaScript对象,要使用JSON.parse()方法:
var obj = JSON. parse( ’ { “a”: “Hello”,“b”: “world””)’);
//结果是{a: ” He1lo” , b: “world” } - 要实现从JavaScript对象转换为JSON字符串,使用JSON.stringify()方法:
var json = JSON .stringify({a: ” Hello” , b: “world” });
//结果是 ‘{“a” : “hello”, “b”: “word”}’
代码测试:
1:创建一个新的web项目;
2:在web创建一个新的 .html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript">
//编写一个JavaScript对象
var user = {
name:"铁锤",
age:3,
sex:"男"
};
console.log(user);
//将js对象转换成JSON对象
var json = JSON.stringify(user);
console.log(json);
console.log("==========");
//将JSON对象转换成js对象
var parse = JSON.parse(json);
console.log(parse);
</script>
</body>
</html>
测试结果:
Controller返回JSON数据
- Jackson应该是目前比较好的json解析工具了
- 当然工具不止这—个,比如还有阿里巴巴的fastjson等等。·我们这里使用Jackson,使用它需要导入它的jar包;
Jackson的使用
1: 创建一个新的web项目;导入jackson依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
2:配置SpringMVC,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自动扫描包-->
<context:component-scan base-package="com.baidu.controller"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
3:创建一个controller包,新建一个类
/**
* 返回一个普通的字符串
*/
//@Controller 他会走视图解析器
@RestController //他直接返回一个字符串
public class UserController {
// @RequestMapping(value = "/j1" ,produces = "application/json;charset=utf-8")
@RequestMapping("/j1")
@ResponseBody//(配合Controller使用的)它就不会走视图解析器,会返回一个字符串
public String json1() throws JsonProcessingException {
//Jackson, ObjectMapper
ObjectMapper mapper = new ObjectMapper();
User user = new User("铁锤",18,"男");
String str = mapper.writeValueAsString(user);
return str;
}
注意:这里将会有的一个JSON的乱码问题:
解决:1:在配置文件中配置解决JSON乱码问题的配置(推荐这一种方法)
<!--JSON乱码问题配置-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
2:就是在RequestMapping查看源码,有一个 produces()方法;可以在设置
@RequestMapping(value = “/j1” ,produces = “application/json;charset=utf-8”);
这样也可以解决乱码问题
启动TomCat:测试结果
这里返回一个普通的字符串:如果是一个对象可以返回吗?
//返回一个对象的字符串
@RequestMapping("/j2")
public String json2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
ArrayList<User> userList = new ArrayList<>();
User user1 = new User("铁锤",18,"男");
User user2 = new User("铁锤",18,"男");
User user3 = new User("铁锤",18,"男");
User user4 = new User("铁锤",18,"男");
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
String string = mapper.writeValueAsString(userList);
return string;//new ObjectMapper().writeValueAsString(userList);
}
测试:
返回一个时间的字符串
//返回一个时间的字符串
@RequestMapping("/j3")
public String json3() throws JsonProcessingException {
//1:传统的java程序解决
//2:使用ObjectMapper 来格式化输出
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.CLOSE_CLOSEABLE,false);
//自定义日期的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(sdf);
Date date = new Date();
//ObjectMapper ,时间解析后的默认格式是 Timestamp:时间戳
return mapper.writeValueAsString(date);//new ObjectMapper().writeValueAsString(userList);
}
测试结果:
注意:这里会遇到一个时间的戳的输出,从1970年开始的时间戳:
解决方法:
1:传统的java程序解决(好使)
//自定义日期的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return mapper.writeValueAsString(sdf.format(date));//new ObjectMapper().writeValueAsString(userList);
2:使用ObjectMapper 来格式化输出
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.CLOSE_CLOSEABLE,false);
//自定义日期的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(sdf);
return mapper.writeValueAsString(date);
封装ObjectMapper
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.CLOSE_CLOSEABLE,false);
//自定义日期的格式
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
mapper.setDateFormat(sdf);
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
往后就可以直接用了;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71918.html