返回顶部
首页 > 资讯 > 后端开发 > Python >实例详解SpringBoot默认的JSON解析方案
  • 213
分享到

实例详解SpringBoot默认的JSON解析方案

2024-04-02 19:04:59 213人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、什么是JSON二、如何在SpringBoot中使用jsON三、举例四、拓展总结一、什么是JSON JSON(javascript Object Notation)是一种基于J

一、什么是JSON

JSON(javascript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式。JSON是基于文本的,轻量级的,通常被认为易于读/写。

好了,废话不多说,下面开始介绍如何在springBoot中使用JSON。

二、如何在SpringBoot中使用JSON

学习json之前,我们必须先了解一下HttpMessageConverter,其实看名字就知道,这是一个消息转换工具

下面我来介绍一下它的两个功能:

1、将服务端返回的对象序列化成 JSON 字符串

2、将前端传来的 JSON 字符串反序列化成 Java 对象。

所有的 JSON 生成都离不开相关的 HttpMessageConverter。

springMVC 自动配置了 Jackson 和 Gson 的 HttpMessageConverter,Spring Boot 中又对此做了自动化配置,下面是两者对应源码的路径:


org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration

org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration

所以,如果用户使用 jackson 和 gson 的话,没有其他额外配置,则只需要添加依赖即可。

三、举例

第一步】老规矩,先创建一个SpringBoot项目。通过右边的Maven可以看到,其实SpringBoot已经将json集成进来了,Maven结构如下图:

第二步】创建一个bean和一个controller类,具体项目结构和代码如下:

【项目结构】

【User.java】


package com.manGo.json.bean;

import com.fasterxml.jackson.annotation.JsonFORMat;

import java.util.Date;

public class User {

    private Integer id;
    private String username;
    private String address;
    
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

【UserController.java】


package com.mango.json.controller;

import com.mango.json.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.WEB.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
public class UserController {

    @GetMapping("/user")
    public List<User> getUser() {
        List<User> userList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId(i);
            user.setUsername("mango>>>" + i);
            user.setAddress("www.mango.com>>>" + i);
            user.setBirthday(new Date());
            userList.add(user);
        }
        return userList;
    }
}

【运行结果】

注:大家可能和我显示的效果不一样,但是内容肯定是一样的,如果需要显示成我这样格式,需要给浏览器装一款插件JSONView,这款插件就专门为json格式设计的,因为很复杂的json格式,是不容易阅读的。

四、拓展

上面就是SpringBoot中json的简单用法,下面我会再针对json进行一点内容的拓展。

1、如果碰到bean中有日期类型的属性,json该怎么处理日期格式?

第一种办法】我们可以在该属性上添加@JsonFormat(pattern = “yyyy-MM-dd”)注解,代码如下:


package com.mango.json.bean;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;

public class User {

    private Integer id;
    private String username;
    private String address;
    
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

如果该bean中存在许多日期类型的属性呢,这么做就不是那么合适了,所以,可以采用下面的第二种办法。

第二种办法】大家都知道json肯定离不开ObjectMapper,因为json格式和java中的对象之间进行转换就是通过ObjectMapper类,想深入研究的朋友可以看看这个类的源码。

在上面我提到了SpringBoot自动化配置json,也给出了json源码的路径,大家可以进去看看,是否看到下面一段代码,这就是它的核心之处。


    @Configuration(proxyBeanMethods = false)
	@ConditionalOnClass(ObjectMapper.class)
	@ConditionalOnBean(ObjectMapper.class)
	@ConditionalOnProperty(name = HttpMessageConvertersAutoConfiguration.PREFERRED_MAPPER_PROPERTY,
			havingValue = "jackson", matchIfMissing = true)
	static class MappingJackson2HttpMessageConverterConfiguration {

		@Bean
		@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class,
				ignoredType = {
						"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter",
						"org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" })
		MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
			return new MappingJackson2HttpMessageConverter(objectMapper);
		}

	}

其中,mappingJackson2HttpMessageConverter方法就是我们需要用到的,这是SpringBoot为我们默认提供的,如果我们不重写这个方法,默认它就会生效,反之则失效。换句话说,我们不管是否重写该方法,json我们都可以用。

既然我们现在有需求了,我们就重写这个方法,具体代码如下:

【WebMvcConfig.java】


package com.mango.json.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.text.SimpleDateFormat;

@Configuration
public class WebMvcConfig {

    @Bean
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        converter.setObjectMapper(objectMapper);
        return converter;
    }
}

注:重写这个方法后,我们可以将bean中的注解@JsonFormat(pattern = “yyyy-MM-dd”)注释掉,重启项目即可。(如果大家有兴趣,可以进行debug调试,看看默认的方法是否还有效)

其实,大家可以从上面的代码看到,我们真正对日期格式进行设置的是对ObjectMapper进行操作的,所以这段重写的代码是否可以精简呢?答案是:当然可以。

有心的朋友肯定留意到了,上面SpringBoot默认提供的mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中,是存在ObjectMapper的,至于这个ObjectMapper是从哪里来的,大家可以根据下面路径中的源码看看:

【JacksonAutoConfiguration.java源码路径】


org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration

【具体源码如下】


@Configuration(proxyBeanMethods = false)
	@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
	static class JacksonObjectMapperConfiguration {

		@Bean
		@Primary
		@ConditionalOnMissingBean
		ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
			return builder.createXmlMapper(false).build();
		}

	}

对,其实mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中ObjectMapper就是上面源码中jacksonObjectMapper方法返回的ObjectMapper,大家可以debug试一下,看看是否正确。

废话不多说了,下面我就重写ObjectMapper,具体代码如下:

【WebMvcConfig.java】


package com.mango.json.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.text.SimpleDateFormat;

@Configuration
public class WebMvcConfig {

    

    @Bean
    ObjectMapper objectMapper(){
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        return objectMapper;
    }
}

【运行结果】

注:因为上面两种方法最后的结果都是一样的,所以运行结果图只放一张。

总结

到此这篇关于SpringBoot默认的JSON解析方案的文章就介绍到这了,更多相关SpringBoot默认JSON解析内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 实例详解SpringBoot默认的JSON解析方案

本文链接: https://lsjlt.com/news/132718.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 实例详解SpringBoot默认的JSON解析方案
    目录一、什么是JSON二、如何在SpringBoot中使用JSON三、举例四、拓展总结一、什么是JSON JSON(JavaScript Object Notation)是一种基于J...
    99+
    2024-04-02
  • Ajax responseText解析json数据案例详解
    解决ajax处理服务器端返回结果responseText中是JSON的数据。 第一,json格式的文件内容如下: { "city":"ShangHai", "...
    99+
    2024-04-02
  • Oracle解析复杂json的方法实例详解
    问题背景:          当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的P...
    99+
    2024-04-02
  • 实例详解esp8266解析json数据的方法
    #include <ArduinoJson.h> void setup() { Serial.begin(115200); Serial.println("这里用...
    99+
    2024-04-02
  • mysql(5.6及以下)解析json的方法实例详解
    mysql(5.6及以下)解析json #json解析函数 DELIMITER $$ DROP FUNCTION IF EXISTS `json_extract_c`$$ CREATE ...
    99+
    2024-04-02
  • springboot默认的5种加载路径详解
    目录前言一、application.properties/.yml文件初识二、application.properties/.yml文件可以在其他路径吗三、总结前言 上次分享了如何一...
    99+
    2024-04-02
  • Android编程之json解析实例详解
    本文实例分析了Android编程之json解析的方法。分享给大家供大家参考,具体如下: JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流...
    99+
    2022-06-06
    json解析 JSON Android
  • springboot实现FastJson解析json数据的方法
    最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧!添加jar包:<dependency> <groupId>com.alibaba</groupId...
    99+
    2023-05-31
    spring boot fastjson
  • Go语言实现JSON解析的方法详解
    目录1、json序列化2、Json反序列化为结构体对象3、Json反序列化为map类型4、Tag的使用在日常项目中,使用Json格式进行数据封装是比较常见的操作,看一下golang怎...
    99+
    2024-04-02
  • Android json数据解析详解及实例代码
     Android json数据解析详解 移动开发经常要与服务器数据交互,也常使用json数据格式,那就说说Android json解析。 1.最简单json格式解析...
    99+
    2022-06-06
    json数据 JSON Android
  • SpringBoot详细探究讲解默认组件扫描
    目录一、前期准备1.1 创建工程1.2 创建Controller二、探究过程2.1 探究目标2.2 探究过程2.2.1 回顾容器bean的创建与刷新2.2.2 SpringAppli...
    99+
    2024-04-02
  • C++ TinyXML解析案例详解
    目录TinyXML介绍TinyXML类说明下载和编译简单的例子读取XML写入xmlXML删除操作XML修改操作TinyXML介绍 最近做一个负载均衡的小项目,需要解析xml配置文件,...
    99+
    2024-04-02
  • Java解析XML(4种方式)案例详解
    目录1.DOM方式2.SAX方式3.JDOM方式4.DOM4J方式总结 xml文件 <?xml version="1.0" encoding="utf-8" ...
    99+
    2024-04-02
  • Java解析XML(4种方式)案例详解
    在Java中,有多种方式可以解析XML文件。下面是四种常用的方式:1. DOM(Document Object Model)方式:D...
    99+
    2023-08-11
    java
  • win7默认网关不可用解决方案
    有很多应用win7的朋友们发觉windows7电脑操作系统仿佛有一个问题,便是和无线路由器的联接经常地全自动断线,根据确诊说成默认网关不可用这个问题该如何解决呢?下边我们一起来瞧瞧吧。win7默认网关不可用的解决方案:最先点击左下方开始,随...
    99+
    2023-07-11
  • SpringBoot实现WEB的常用功能案例详解
    目录前言SpringMVC整合支持Spring MVC自动配置项目基础环境搭建功能扩展实现Spring MVC功能扩展实现Spring整合Servlet三大组件使用注册方式整合使用组...
    99+
    2024-04-02
  • Springboot 2.x RabbitTemplate默认消息持久化的原因解析
    目录前言springboot测试测试现象源码分析联想前言 之前在Java直接测试mq消息持久化时,采取如下的配置实现消息的持久化: //消息持久化测试 Builder builder...
    99+
    2024-04-02
  • 详解python中的defaultdict 默认值
    目录前言语法setdefault()和defaultdict()的区别setdefault()defaultdict()前言 在字典中查找某一个值的时候,若key不存在就会返回一个k...
    99+
    2023-05-16
    defaultdict 默认值 python defaultdict 默认值
  • Python中的默认参数详解
    文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug。 基本原理 在 ...
    99+
    2023-01-31
    详解 参数 Python
  • SpringBoot实战之处理异常案例详解
    前段时间写了一篇关于实现统一响应信息的博文,根据文中实战操作,能够解决正常响应的一致性,但想要实现优雅响应,还需要优雅的处理异常响应,所以有了这篇内容。 作为后台服务,能够正确的处理...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作