Spring Boot中JSON的数据结构和交互讲解以及实战(超详细 附源码)

简介: Spring Boot中JSON的数据结构和交互讲解以及实战(超详细 附源码)

Spring MVC在数据绑定的过程中,需要对传递数据的格式和类型进行转换,它既可以转换String登类型的数据,也可以转换JSON等其他类型的数据。

JSON数据结构

JSON(JavaScript Object Notation JS对象标记)是一种轻量级的数据交换格式,与XML一样,JSON也是基于纯文本的数据格式 它有以下两种数据结构

1:对象结构

对象结构以{开始 }结束,中间部分由0个或多个以英文,分割的key/value对构成,key和value之间以英文:分割,语法结构如下

{

key1:value1,

key2:value2,

...

}

2:数组结构

数组结构以[开始以]结束,中间部分由0个活多个以英文,分割的值的列表组成 语法结构如下

[

value1,

value2.

...

]

JSON数据转换

为实现浏览器与控制器类之间的JSON数据交互,Spring MVC提供了MappingJackson2HttpMessageConverter实现类默认处理JSON格式请求响应。该实现类利用Jackson开源包读取JSON数据,将Java对象转换为JSON对象和XML文档,同时也可以将JSON对象和XML文档转换为Java对象

在使用注解开发时,需要用到两个重要的JSON格式转换注解

1:@RequestBody

用于将请求体的数据绑定到方法的形参上,该注解应用在方法的形参上

2:@ResponseBody

用于直接返回JSON对象 该注解应用在方法上

下面通过一个实例来演示JSON数据交互过程

1:创建Web应用ch2_5并导入JAR包

2:创建Web和Spring MVC配置类

Webconfig类代码如下

package config;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class WebConfig implements WebApplicationInitializer{
  @Override
  public void onStartup(ServletContext arg0) throws ServletException {
    AnnotationConfigWebApplicationContext ctx 
    = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringMVCConfig.class);//注册Spring MVC的Java配置类SpringMVCConfig
    ctx.setServletContext(arg0);//和当前ServletContext关联
    /**
     * 注册Spring MVC的DispatcherServlet
     */
    Dynamic servlet = arg0.addServlet("dispatcher", new DispatcherServlet(ctx));
    servlet.addMapping("/");
    servlet.setLoadOnStartup(1);
  }
}

SpringMVCConfig类代码如下

package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("controller")
public class SpringMVCConfig implements WebMvcConfigurer {
  /**
   * 配置视图解析器
   */
  @Bean
  public InternalResourceViewResolver getViewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/jsp/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
  }
  /**
   * 配置静态资源
   */
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/js/**").addResourceLocations("/js/");
  }
}

3:创建JSP页面 并引入jQuery

首先去官方网站http://jquery.com/download/下载jQuery插件 然后复制到WebContent目录下

创建JSP文件index.jsp 代码如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
  function testJson() {
    //获取输入的值pname为id
    var pname = $("#pname").val();
    var password = $("#password").val();
    var page = $("#page").val();
    $.ajax({
      //请求路径
      url : "${pageContext.request.contextPath }/testJson",
      //请求类型
      type : "post",
      //data表示发送的数据
      data : JSON.stringify({pname:pname,password:password,page:page}),
      //定义发送请求的数据格式为JSON字符串
      contentType : "application/json;charset=utf-8",
      //定义回调响应的数据格式为JSON字符串,该属性可以省略
      dataType : "json",
      //成功响应的结果
      success : function(data){
        if(data != null){
          //返回一个Person对象
          //alert("输入的用户名:" + data.pname + ",密码:" + data.password + ",年龄:" +  data.page);
          //ArrayList<Person>对象
          /**for(var i = 0; i < data.length; i++){
            alert(data[i].pname);
          }**/
          //返回一个Map<String, Object>对象
          //alert(data.pname);//pname为key
          //返回一个List<Map<String, Object>>对象
          for(var i = 0; i < data.length; i++){
            alert(data[i].pname);
          }
        }
      }
    });
  }
</script>
</head>
<body>
  <form action="">
    用户名:<input type="text" name="pname" id="pname"/><br>
    密码:<input type="password" name="password" id="password"/><br>
    年龄:<input type="text" name="page" id="page"/><br>
    <input type="button" value="测试" onclick="testJson()"/>
  </form>
</body>
</html>

4:创建实体类

在src目录上创建pojo包并创建Person实体类

package pojo;
public class Person {
  private String pname;
  private String password;
  private Integer page;
  public String getPname() {
    return pname;
  }
  public void setPname(String pname) {
    this.pname = pname;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public Integer getPage() {
    return page;
  }
  public void setPage(Integer page) {
    this.page = page;
  }
}

5:创建控制器类

TestController类代码如下

package controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import pojo.Person;
@Controller
public class TestController {
  /**
   * 接收页面请求的JSON数据,并返回JSON格式结果
   */
  @RequestMapping("/testJson")
  @ResponseBody
  public List<Map<String, Object>> testJson(@RequestBody Person user) {
    //打印接收的JSON格式数据
    System.out.println("pname=" + user.getPname() +
        ", password=" + user.getPassword() + ",page=" + user.getPage());
    //返回Person对象
    //return user;
    /**ArrayList<Person> allp = new ArrayList<Person>();
    Person p1 = new Person();
    p1.setPname("陈恒1");
    p1.setPassword("123456");
    p1.setPage(80);
    allp.add(p1);
    Person p2 = new Person();
    p2.setPname("陈恒2");
    p2.setPassword("78910");
    p2.setPage(90);
    allp.add(p2);
    //返回ArrayList<Person>对象
    return allp;
    **/
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("pname", "陈恒2");
    map.put("password", "123456");
    map.put("page", 25);
    //返回一个Map<String, Object>对象
    //return map;
    //返回一个List<Map<String, Object>>对象
    List<Map<String, Object>> allp = new ArrayList<Map<String, Object>>();
    allp.add(map);
    Map<String, Object> map1 = new HashMap<String, Object>();
    map1.put("pname", "陈恒3");
    map1.put("password", "54321");
    map1.put("page", 55);
    allp.add(map1);
    return allp;
  }
}

6:测试应用

选择Run命令发布并运行应用即可

相关文章
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
1123 9
|
11月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
866 0
|
11月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
597 0
|
11月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
1588 0
|
7月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
713 3
|
8月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
409 3
|
11月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
694 4
JSON数据解析实战:从嵌套结构到结构化表格
|
11月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
830 19
|
11月前
|
数据库 C++
【数据结构进阶】红黑树超详解 + 实现(附源码)
本文深入探讨了红黑树的实现原理与特性。红黑树是一种自平衡二叉搜索树,通过节点着色(红/黑)和特定规则,确保树的高度接近平衡,从而实现高效的插入、删除和查找操作。相比AVL树,红黑树允许一定程度的不平衡,减少了旋转调整次数,提升了动态操作性能。文章详细解析了红黑树的性质、插入时的平衡调整(变色与旋转)、查找逻辑以及合法性检查,并提供了完整的C++代码实现。红黑树在操作系统和数据库中广泛应用,其设计兼顾效率与复杂性的平衡。
2443 3
|
11月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——定义返回的统一 json 结构
本课主要讲解Spring Boot中的全局异常处理方法。在项目开发中,各层操作难免会遇到各种异常,若逐一处理将导致代码耦合度高、维护困难。因此,需将异常处理从业务逻辑中分离,实现统一管理与友好反馈。本文通过定义一个简化的JsonResult类(含状态码code和消息msg),结合全局异常拦截器,展示如何封装并返回标准化的JSON响应,从而提升代码质量和用户体验。
298 0