后台快速开发框架搭建记录(2)——JSON处理相关

一、SpringBoot中返回JSON

User实体:

package com.tianqicode.myquickframe.modules.sys.entity;

import lombok.Data;

import java.util.Date;

/**
 * @author wangtianqi
 * @create 2020-09-17 13:48
 */
@Data
public class User {

    private Long userId;

    private String username;

    private String password;

    private Date createTime;

    public User(Long userId, String username, String password, Date createTime) {
        this.userId = userId;
        this.username = username;
        this.password = password;
        this.createTime = createTime;
    }

    public User() {
    }
}

controller:

package com.tianqicode.myquickframe.modules.sys.controller;

import com.tianqicode.myquickframe.modules.sys.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @author wangtianqi
 * @create 2020-09-17 13:50
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/list")
    public List<User> list() {

        List<User> userList = new ArrayList<>();
        Date today = new Date();
        for (int i = 0; i < 5; i++) {
            Long id = i + 0l;
            userList.add(new User(id, "张" + i, "123456" + i, today));
        }
        return userList;
    }
}

不需要更多的配置,现在只需要启动项目,在浏览器发出请求。就可以在页面看到json格式的数据。

[{"userId":0,"username":"张0","password":"1234560","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":1,"username":"张1","password":"1234561","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":2,"username":"张2","password":"1234562","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":3,"username":"张3","password":"1234563","createTime":"2020-09-17T06:06:46.538+00:00"},
{"userId":4,"username":"张4","password":"1234564","createTime":"2020-09-17T06:06:46.538+00:00"}]

如果需要对日起进行格式化,仅需在配置文件中做如下配置。

server:
  port: 8765
  servlet:
    context-path: /
spring:
  jackson:
#    时间格式化
    date-format: yyyy-MM-dd HH:mm:ss
#    设置时区
    time-zone: GMT+8

没错,SpringBoot就是这么方便,前提是你使用Jackson或是Gson。springboot对Jackson或是Gson做了自动配置。数据并不是自然而然的变为了json格式,springboot帮我们做了这些工作。还是那句话:知其然,知其所以然。简单了解一下springboot都干了些什么。

二、HttpMessageConverter

2.1、是什么

HttpMessageConverter是一个消息转换工具,有两方面的功能:

  1. 将服务端返回的对象序列化成 JSON 字符串
  2. 将前端传来的 JSON 字符串反序列化成 Java 对象

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

2.2、Springboot中的HttpMessageConverter

打开全局搜索HttpMessageConverter找到这个类JacksonHttpMessageConvertersConfiguration并打开它,这个类就是Springboot对Jackson的自动配置类。

找到这个方法mappingJackson2HttpMessageConverter,看名字就知道它有什么用了。它为我们自动配置了Jackson。
注意看@ConditionalOnMissingBean这个注解下声明:如果容器中没有这两个类型的bean,那么就用springboot提供的方法。
同时看@ConditionalOnProperty这个注释,意味着同样可以在配置文件中配置jackson。

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

		@Bean
		// 注意这个注解,如果你没有提供一个MappingJackson2HttpMessageConverter类型的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);
		}

	}

如果我们提供了这个bean呢?

package com.tianqicode.myquickframe.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;

/**
 * @author wangtianqi
 * @create 2020-09-17 14:30
 */
@Configuration
public class WebConfig {
    
    @Bean
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper om = new ObjectMapper();
        // 设置自己的日期格式
        om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
        converter.setObjectMapper(om);
        return converter;
    }
}

重启项目,再次请求之前路径,发现时间变为了我们自己配置的格式。

[{"userId":0,"username":"张0","password":"1234560","createTime":"2020/09/17 14:33:57"},
{"userId":1,"username":"张1","password":"1234561","createTime":"2020/09/17 14:33:57"},
{"userId":2,"username":"张2","password":"1234562","createTime":"2020/09/17 14:33:57"},
{"userId":3,"username":"张3","password":"1234563","createTime":"2020/09/17 14:33:57"},
{"userId":4,"username":"张4","password":"1234564","createTime":"2020/09/17 14:33:57"}]

这就是Springboot所说的:约定大于配置。 如果你有,用你的,这个项目可以正常工作。如果你没有,那么就用我的,这个项目依然可以正常工作。
以上对于Gson同理。全局搜索HttpMessageConverters,可以找到GsonHttpMessageConvertersConfiguration。打开源码,跟Jackson是一样的道理。

三、总结

如果在Springboot项目中使用Jackson或Gson,不需要额外配置只需要添加依赖即可。同时也可以使用配置文件或配置类对其进行配置。
另外:如果配置文件与配置类同时配置同一个参数,那么会优先以配置类为准。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值