Spring Boot返回Json数据及数据封装

简介: Spring Boot中,@RestController注解可自动将数据转为JSON格式,其底层默认使用Jackson框架。该注解等价于@Controller与@ResponseBody结合,简化开发。Jackson支持对象、List、Map等常见数据结构的JSON转换,并可通过配置自定义null值处理方式,如将null转为空字符串,提升接口返回的规范性与前端友好性。(238字)

在项目开发中,接口与接口之间,前后端之间数据的传输都使用 Json 格式,在 Spring Boot 中,接口返回 Json 格式的数据很简单,在 Controller 中使用@RestController注解即可返回 Json 格式的数据,@RestController也是 Spring Boot 新增的一个注解,我们点进去看一下该注解都包含了哪些东西。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}
可以看出, @RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解,使用过 Spring 的朋友对 @Controller 注解已经非常了解了,这里不再赘述, @ResponseBody 注解是将返回的数据结构转换为 Json 格式。所以在默认情况下,使用了 @RestController 注解即可将返回的数据结构转换成 Json 格式,Spring Boot 中默认使用的 Json 解析技术框架是 jackson。我们点开 pom.xml 中的 spring-boot-starter-web 依赖,可以看到一个 spring-boot-starter-json 依赖:


org.springframework.boot
spring-boot-starter-json
2.0.3.RELEASE
compile

Spring Boot 中对依赖都做了很好的封装,可以看到很多 spring-boot-starter-xxx 系列的依赖,这是 Spring Boot 的特点之一,不需要人为去引入很多相关的依赖了,starter-xxx 系列直接都包含了所必要的依赖,所以我们再次点进去上面这个 spring-boot-starter-json 依赖,可以看到:


com.fasterxml.jackson.core
jackson-databind
2.9.6
compile


com.fasterxml.jackson.datatype
jackson-datatype-jdk8
2.9.6
compile


com.fasterxml.jackson.datatype
jackson-datatype-jsr310
2.9.6
compile


com.fasterxml.jackson.module
jackson-module-parameter-names
2.9.6
compile

到此为止,我们知道了 Spring Boot 中默认使用的 json 解析框架是 jackson。下面我们看一下默认的 jackson 框架对常用数据类型的转 Json 处理。

  1. Spring Boot 默认对Json的处理
    在实际项目中,常用的数据结构无非有类对象、List对象、Map对象,我们看一下默认的 jackson 框架对这三个常用的数据结构转成 json 后的格式如何。
    1.1 创建 User 实体类
    为了测试,我们需要创建一个实体类,这里我们就用 User 来演示。
    public class User {
    private Long id;
    private String username;
    private String password;
    / 省略get、set和带参构造方法 /
    }
    1.2 创建Controller类
    然后我们创建一个 Controller,分别返回 User对象、List 和 Map。
    import com.itcodai.course02.entity.User;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    @RestController
    @RequestMapping("/json")
    public class JsonController {
    @RequestMapping("/user")
    public User getUser() {
     return new User(1, "倪升武", "123456");
    
    }
    @RequestMapping("/list")
    public List getUserList() {
     List<User> userList = new ArrayList<>();
     User user1 = new User(1, "倪升武", "123456");
     User user2 = new User(2, "达人课", "123456");
     userList.add(user1);
     userList.add(user2);
     return userList;
    
    }
    @RequestMapping("/map")
    public Map getMap() {
     Map<String, Object> map = new HashMap<>(3);
     User user = new User(1, "倪升武", "123456");
     map.put("作者信息", user);
     map.put("博客地址", "http://blog.itcodai.com");
     map.put("CSDN地址", "http://blog.csdn.net/eson_15");
     map.put("粉丝数量", 4153);
     return map;
    
    }
    }
    1.3 测试不同数据类型返回的json
    OK,写好了接口,分别返回了一个 User 对象、一个 List 集合和一个 Map 集合,其中 Map 集合中的 value 存的是不同的数据类型。接下来我们依次来测试一下效果。
    在浏览器中输入:localhost:8080/json/user 返回 json 如下:
    {"id":1,"username":"倪升武","password":"123456"}
    在浏览器中输入:localhost:8080/json/list 返回 json 如下:
    [{"id":1,"username":"倪升武","password":"123456"},{"id":2,"username":"达人课","password":"123456"}]
    在浏览器中输入:localhost:8080/json/map 返回 json 如下:
    {"作者信息":{"id":1,"username":"倪升武","password":"123456"},"CSDN地址":"http://blog.csdn.net/eson_15","粉丝数量":4153,"博客地址":"http://blog.itcodai.com"}
    可以看出,map 中不管是什么数据类型,都可以转成相应的 json 格式,这样就非常方便。
    1.4 jackson 中对null的处理
    在实际项目中,我们难免会遇到一些 null 值出现,我们转 json 时,是不希望有这些 null 出现的,比如我们期望所有的 null 在转 json 时都变成 "" 这种空字符串,那怎么做呢?在 Spring Boot 中,我们做一下配置即可,新建一个 jackson 的配置类:
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
    import java.io.IOException;
    @Configuration
    public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
     ObjectMapper objectMapper = builder.createXmlMapper(false).build();
     objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
         @Override
         public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
             jsonGenerator.writeString("");
         }
     });
     return objectMapper;
    
    }
    }
    然后我们修改一下上面返回 map 的接口,将几个值改成 null 测试一下:
    @RequestMapping("/map")
    public Map getMap() {
    Map map = new HashMap<>(3);
    User user = new User(1, "倪升武", null);
    map.put("作者信息", user);
    map.put("博客地址", "http://blog.itcodai.com");
    map.put("CSDN地址", null);
    map.put("粉丝数量", 4153);
    return map;
    }
    重启项目,再次输入:localhost:8080/json/map,可以看到 jackson 已经将所有 null 字段转成了空字符串了。
    {"作者信息":{"id":1,"username":"倪升武","password":""},"CSDN地址":"","粉丝数量":4153,"博客地址":"http://blog.itcodai.com"}
相关文章
|
12天前
|
数据采集 人工智能 安全
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
597 4
|
8天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
345 164
|
7天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
349 155

热门文章

最新文章