本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接

https://space.bilibili.com/95256449?spm_id_from=333.788.b_765f7570696e666f.2

JSON

  • JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,其实就是前后端交互数据的一种格式。---个人理解其实就是重写toString的格式,只要输出是String类型是JSON格式的就可以了。

  • 在 JavaScript 语言中,一切都是对象。

  • JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

  • 在一些公司中,如果是前后端分离的,我们就不会在Controller里面直接定向页面,而是传递一个JSON格式的字符串。

  • 示例html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>

  6. <script type="text/javascript">
  7. //编写一个JavaScript对象
  8. var user = {
  9. name:"任中沛",
  10. age:3,
  11. sex:"男"
  12. };

  13. //将js对象转换为JSON对象
  14. var json = JSON.stringify(user);

  15. console.log(json);
  16. console.log(user);

  17. //将JSON对象转换为JavaScript对象
  18. var obj = JSON.parse(json);
  19. console.log(obj);
  20. </script>


  21. </head>
  22. <body>

  23. </body>
  24. </html>

通过Jackson工具生成JSON格式

  • 导入依赖

  • 这里使用的是jackson,但是其实还有其他的也能实现

  1. <!--jackson-->
  2. <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  3. <dependency>
  4. <groupId>com.fasterxml.jackson.core</groupId>
  5. <artifactId>jackson-databind</artifactId>
  6. <version>2.10.3</version>
  7. </dependency>
  • 测试类

  1. package com.rzp.controller;


  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.rzp.pojo.User;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.ResponseBody;

  8. @Controller
  9. public class UserController {

  10. //produces ="application/json;charset=utf-8"是为了中文不乱码
  11. @RequestMapping(value = "/j1",produces ="application/json;charset=utf-8")
  12. @ResponseBody //增加ResponseBody,就不会走视图解析器,会直接返回一个字符串
  13. public String json1() throws JsonProcessingException {

  14. ObjectMapper mapper = new ObjectMapper();

  15. //创建一个对象
  16. User user = new User("rzp",3,"男");
  17. //调用Jackson的ObjectMapper对象的writeValueAsString方法,转化为JSON字符串
  18. String str = mapper.writeValueAsString(user);

  19. return str;
  20. }
  21. }

  • 测试结果

    • 可以看到,其实就是一个重写的toString方法,我们自己实现也是可以的。

JSON传递List

  1. @RequestMapping("/j2")
  2. public String json2() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();

  4. List userList = new ArrayList();
  5. User user1 = new User("rzp1",3,"男");
  6. User user2 = new User("rzp2",3,"男");
  7. User user3 = new User("rzp3",3,"男");

  8. userList.add(user1);
  9. userList.add(user2);
  10. userList.add(user3);
  11. String str = mapper.writeValueAsString(userList);
  12. return str;
  13. }

传递日期

  • 传递后默认会解释为时间戳

  1. @RequestMapping("/j3")
  2. public String json3() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();
  4. Date date = new Date();
  5. String str = mapper.writeValueAsString(date);
  6. return str;
  7. }

  1.  
  • 如果想传递为可读格式,可以使用SimpleDateFormat直接转换

  1. @RequestMapping("/j3")
  2. public String json3() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();
  4. Date date = new Date();
  5. //自定义日期的格式
  6. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  7. String str = mapper.writeValueAsString(sdf.format(date));
  8. return str;
  9. }

  • 也可以通过ObjectMapper的设置转换

  1. @RequestMapping("/j3")
  2. public String json3() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();
  4. //关闭以时间戳形式显示日期
  5. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
  6.  
  7. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  8. //设定mapper的日期格式
  9. mapper.setDateFormat(sdf);
  10. Date date = new Date();
  11. //自定义日期的格式
  12. // String str = mapper.writeValueAsString(sdf.format(date));
  13. String str = mapper.writeValueAsString(date);
  14. return str;
  15. }

前后端分离的注解

在上面例子中,我们使用ResponseBody注解,来控制这个类返回的字符串不走视图解析器。除了这个配置方式以外,我们还可以在类上面使用RestController注解。

  1. ...
  2. @ResponseBody //增加ResponseBody,就不会走视图解析器,会直接返回一个字符串
  3. public String json1() throws JsonProcessingException {
  4. ....
  • RestController

  1. @RestController
  2. public class UserController {
  3. @RequestMapping(value = "/j1")
  4. //这种情况就不需要给ResponseBody了
  5. public String json1() throws JsonProcessingException {
  6. ObjectMapper mapper = new ObjectMapper();
  7. User user = new User("rzp",3,"男");
  8. String str = mapper.writeValueAsString(user);
  9. return str;
  10. }
  11. }
  • 封装成utils

  1. public class JsonUtils {
  2. public static String getJson(ObjectMapper mapper,String dataFormat) throws JsonProcessingException {
  3. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
  4. SimpleDateFormat sdf = new SimpleDateFormat(dataFormat);
  5. mapper.setDateFormat(sdf);
  6. Date date = new Date();
  7. String str = mapper.writeValueAsString(date);
  8. return str;
  9. }
  10.  
  11. public static String getJson(ObjectMapper mapper) throws JsonProcessingException {
  12. return getJson(mapper,"yyyy-MM-dd HH:mm:ss");
  13. }
  14.  
  15. public static String getJson(ObjectMapper mapper,Object object) throws JsonProcessingException {
  16. return mapper.writeValueAsString(object.toString());
  17. }
  18. }

测试

  1. @RequestMapping("/j4")
  2. public String json4() throws JsonProcessingException {
  3. ObjectMapper mapper = new ObjectMapper();
  4. String str = JsonUtils.getJson(mapper,"yyyy-MM-dd HH:mm:ss");
  5. return str;
  6. }
  7.  
  8. @RequestMapping("/j2")
  9. public String json2() throws JsonProcessingException {
  10. ObjectMapper mapper = new ObjectMapper();
  11.  
  12. List userList = new ArrayList();
  13. User user1 = new User("rzp1",3,"男");
  14. User user2 = new User("rzp2",3,"男");
  15. User user3 = new User("rzp3",3,"男");
  16.  
  17. userList.add(user1);
  18. userList.add(user2);
  19. userList.add(user3);
  20. return JsonUtils.getJson(mapper,userList);
  21. }

乱码解决

上面我们通过配置RequestMapping的produces属性来解决乱码,但是这种方式每个方法的都要添加,比较麻烦,SpringMVC还提供了另一种统一的方法。

  • 备注:这里走的是JSON,没有走过滤器,所以上一章中过滤器这里是不起作用的

只需要在sprinmvc-servlet.xml的mvc:annotation-driven中配置: <mvc:message-converters register-defaults="true">

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:mvc="http://www.springframework.org/schema/mvc"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/aop
  10. https://www.springframework.org/schema/aop/spring-aop.xsd
  11. http://www.springframework.org/schema/context
  12. https://www.springframework.org/schema/context/spring-context.xsd
  13. http://www.springframework.org/schema/mvc
  14. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  15.  
  16. <context:component-scan base-package="com.rzp.controller"/>
  17. <mvc:default-servlet-handler/>
  18.  
  19. <!--springmvc 统一解决json中文乱码问题-->
  20. <mvc:annotation-driven>
  21. <mvc:message-converters register-defaults="true">
  22. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  23. <constructor-arg value="UTF-8"/>
  24. </bean>
  25. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  26. <property name="objectMapper">
  27. <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
  28. <property name="failOnEmptyBeans" value="false"/>
  29. </bean>
  30. </property>
  31. </bean>
  32. </mvc:message-converters>
  33. </mvc:annotation-driven>
  34.  
  35. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
  36. <property name="prefix" value="/WEB-INF/jsp/"/>
  37. <property name="suffix" value=".jsp"/>
  38. </bean>
  39.  
  40. </beans>

使用fastjson

  • fastjson是阿里巴巴开发的转换JSON字符串的工具。

  • 依赖

  1. <!--fastjson-->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.68</version>
  6. </dependency>
  • 使用更简单,直接使用fastjson里面的JSON类静态方法就可以了

  1. @RequestMapping("/j5")
  2. public String json5() throws JsonProcessingException {
  3. List userList = new ArrayList();
  4. User user1 = new User("rzp1",3,"男");
  5. User user2 = new User("rzp2",3,"男");
  6. User user3 = new User("rzp3",3,"男");
  7.  
  8. userList.add(user1);
  9. userList.add(user2);
  10. userList.add(user3);
  11. //调用JSON的静态方法
  12. String str = JSON.toJSONString(userList);
  13. return str;
  14. }
  • 【JSONObject 代表 json 对象 】

    • JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用 诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map 接口并调用接口中的方法完成的。

  • 【JSONArray 代表 json 对象数组】内部是有List接口中的方法来完成操作的。

  • 【JSON 代表 JSONObject和JSONArray的转化】

    • JSON类源码分析与使用

    • 仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间 的相互转化。

阿里巴巴的工具毕竟是中国人编写的,源码也更适合中国人阅读。

SpringMVC(五):JSON的更多相关文章

  1. Maven搭建SpringMVC+MyBatis+Json项目(多模块项目)

    一.开发环境 Eclipse:eclipse-jee-luna-SR1a-win32; JDK:jdk-8u121-windows-i586.exe; MySql:MySQL Server 5.5; ...

  2. [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类

    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...

  3. SpringMVC学习--json

    简介 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便.比如:webservice接口,传输json数据. springmvc与json交互 @RequestB ...

  4. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  5. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  6. springMvc中406错误解决,springMvc使用json出现406 (Not Acceptable)

    springMvc中406错误解决, springMvc使用json出现406 (Not Acceptable) >>>>>>>>>>> ...

  7. springMvc解决json中文乱码

    springMvc解决json中文乱码 springMvc解决json中文乱码,springMvc中文乱码,spring中文乱码 >>>>>>>>> ...

  8. SpringMVC(三)-- 视图和视图解析器、数据格式化标签、数据类型转换、SpringMVC处理JSON数据、文件上传

    1.视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象 对于那些返回 String,View 或 ModeMap 等类型的处理方法,SpringMVC 也会在内部将 ...

  9. springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用

    springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用 主要内容: 这篇文章主要是总结之前使用springmv接收json的时候遇到的问题,下面通过前台发送a ...

  10. springMVC 处理json 及 HttpMessageConverter 接口

    一.SpringMVC处理json的使用 1.添加依赖jar包 <dependency> <groupId>com.fasterxml.jackson.core</gro ...

随机推荐

  1. Ajax的封装,以及利用jquery的ajax获取天气预报

    1.Ajax的封装 function ajax(type,url,param,sync,datetype,callback){//第一个参数是获取数据的类型,第二个参数是传入open的url,第三个是 ...

  2. C#窗体排列方式

    2020-03-11 每日一例第3天 1.设置父窗体属性:IsMdicontainer设置成true; 2.拖入menustrip控件,修改标题栏中的text文字. 3.点击“加载子窗体”设置代码: ...

  3. vux中表单验证,在提交时自动聚焦到未验证通过的那栏;及循环表单的验证

    首先vux中的表单验证在点击触发,失焦时才显示错误信息,如果不管它,它就没反应,这显然是不合理的:解决办法就是:在提交时做验证,不通过的话就使用.focus()及.blur()方法给它聚焦,失焦. i ...

  4. javascript中怎么判断两个数据类型相等

    在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "obj ...

  5. 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志

    作为网关,日志记录是必不可少的功能,可以在网关出增加requestId来查询整个请求链的调用执行情况等等. 打印请求日志 打印请求日志最重要的就是打印请求参数这些东西,不过RequestBody通常情 ...

  6. CMDB_Agent版本

    目录 CMDB_Agent版本 CMDB概念 CMDB_Agent介绍 agent方案 ssh类方案 相比较 架构目录 bin-start.py 启动文件 conf-config.py 自定义配置文件 ...

  7. ThinkPHP5.0 漏洞测试

    ThinkPHP5.0 漏洞测试 自从ThinkPHP发布漏洞补丁以来,服务器不知道多少次受到了批量扫描漏洞来抓取肉鸡的请求 虽然官方早已发布补丁,还是想试一下TP漏洞,测试两个漏洞 一.全版本执行漏 ...

  8. 如何获取主键返回值(MySQL、Oracle)

    添加用户.返回主键 --场景:在执行新增用户sql后,service层返回新增用户的主键值(与mybatis一起使用) insert into user(username, sex, birthday ...

  9. leetcode 签到 914. 卡牌分组

    题目 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的整数. 仅当你可选的 X ...

  10. sql学习~pivot和unpivot用法

    pivot  可以把列值转换为输出中的多个列. pivot 可以在其他剩余的列的值上执行聚合函数. unpivot 将列转换为列值 语法 SELECT <non-pivoted column&g ...