springboot 使用fastjson 返回json数据以及数据封装

本文介绍了如何在Spring Boot项目中集成Fastjson库,并配置处理null值的策略。通过创建`MyFastJsonConfig`类,自定义了JSON序列化设置,包括处理空字段、空字符串、空数值等。同时,定义了一个统一的JSON响应结构`JsonResult`用于返回数据,确保了返回结果的规范性。最后,展示了在Controller中如何使用这个响应结构并进行测试。

1、添加依赖

编辑pom.xml文件

<!--fastjson 依赖导入-->
<dependency>    
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.35</version>
</dependency>

2、添加配置,使用 fastjson 处理 null

在与controller文件夹同级目录下创建config文件夹,并且在里面添加类MyFastJsonConfig

代码如下

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class MyFastJsonConfig extends WebMvcConfigurationSupport {

    /**
     * 使用阿里 fastjson 作为 JSON MessageConverter
     *
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
                // 保留 Map 空的字段
                SerializerFeature.WriteMapNullValue,
                // 将 String 类型的 null 转成""
                SerializerFeature.WriteNullStringAsEmpty,
                // 将 Number 类型的 null 转成 0
                SerializerFeature.WriteNullNumberAsZero,
                // 将 List 类型的 null 转成 []
                SerializerFeature.WriteNullListAsEmpty,
                // 将 Boolean 类型的 null 转成 false
                SerializerFeature.WriteNullBooleanAsFalse,
                // 避免循环引用
                SerializerFeature.DisableCircularReferenceDetect);

        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List<MediaType> mediaTypeList = new ArrayList<>();
        // 解决中文乱码问题,相当于在 Controller 上的 @RequestMapping 中加了个属性 produces = "application/json"
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(mediaTypeList);
        converters.add(converter);
    }
}

3、定义统一的JSON结构

添加vo文件夹,并且创建JsonResult类

 代码如下:

public class JsonResult<T> {

    private T data;
    private String code;
    private String msg;

    /**
     * 若没有数据返回,默认状态码为 0,提示信息为“操作成功!”
     */
    public JsonResult() {
        this.code = "0";
        this.msg = "操作成功!";
    }

    /**
     * 若没有数据返回,可以人为指定状态码和提示信息
     * @param code
     * @param msg
     */
    public JsonResult(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 有数据返回时,状态码为 0,默认提示信息为“操作成功!”
     * @param data
     */
    public JsonResult(T data) {
        this.data = data;
        this.code = "0";
        this.msg = "操作成功!";
    }

    /**
     * 有数据返回,状态码为 0,人为指定提示信息
     * @param data
     * @param msg
     */
    public JsonResult(T data, String msg) {
        this.data = data;
        this.code = "0";
        this.msg = msg;
    }
    // 省略 get 和 set 方法
}

4、修改Controller中的返回值类型并且测试

    @GetMapping("")
    public JsonResult index() {
        List<UserBean> users = userMapper.getUsers();

        System.out.println("获取用户列表的方法");

        System.out.println(users);

        return new JsonResult(users, "获取用户列表成功");
    }

 

注意:如果返回{},可以在JsonResult中添加对应getter获取data,code,msg,或者使用lombok的@Data注解

 

<think>嗯,用户的问题是关于如何在Spring Boot中接收单个数据JSON参数。我需要先理解他们的需求。他们可能有一个简单的JSON,比如只包含一个字段,比如{"age": 25},想在后端直接获取这个值,而不是封装一个对象。 首先,我应该考虑Spring Boot处理JSON的方式。通常是用@RequestBody将JSON绑定到对象,但单个数据的话,直接映射可能有问题。用户提供的引用里,比如引用[1]和[4]都提到了用@RequestBody接收User对象,但用户需要的是单个数据,不是对象。 可能需要用Map或者JSONObject来接收。引用[3]中的例子用了@RequestBody JSONObject,这样可以直接获取JSON中的字段。或者用Map<String, Object>,然后从中取出值。这样即使只有一个字段也能处理。 另外,如果用户想直接接收基本类型,比如Integer,可能不行,因为@RequestBody需要的是一个对象。所以必须用包装类型或者容器类型。比如用包装类Integer或者用一个包含单个属性的对象。 还有,用户可能需要示例代码。根据引用[3],使用JSONObject的例子可以适用。比如: @PostMapping("/singleParam") public String singleParam(@RequestBody JSONObject json) { int age = json.getIntValue("age"); return "Age: " + age; } 或者用Map: @PostMapping("/singleParam") public String singleParam(@RequestBody Map<String, Object> map) { int age = (Integer) map.get("age"); return "Age: " + age; } 另外,用户可能需要知道如何测试,比如用Postman发送JSON。要提醒他们设置Content-Type为application/json。 还需要注意,如果直接使用基本类型,可能会抛出异常,比如HttpMessageNotReadableException,所以必须用对象或包装类型。 可能的问题还有,如果JSON中的键和参数名不一致,或者类型不匹配,如何处理。不过用户的问题比较基础,可能不需要深入这些细节,但生相关问题时可以提到。 总结步骤:1. 使用@RequestBody接收为JSONObject或Map;2. 提取字段值;3. 处理可能的异常。同时给出两种方法的示例代码,并说明注意事项。</think>在Spring Boot中接收单个数据JSON参数可以通过以下两种方式实现,核心要点在于使用`@RequestBody`注解配合灵活的数据类型处理: ### 一、使用Map接收参数(推荐基础场景) ```java @PostMapping("/singleData") public String receiveSingleData(@RequestBody Map<String, Object> requestMap) { Object value = requestMap.get("keyName"); // 替换为实际JSON键名 return "Received value: " + value; } ``` 此方式通过键值对直接获取数据,适用于临时性参数接收[^3][^4]。 ### 二、使用JSONObject接收参数(推荐精确类型控制) ```java @PostMapping("/singleData") public JSONObject receiveSingleData(@RequestBody JSONObject jsonObject) { int number = jsonObject.getIntValue("numberKey"); // 获取整型值 String text = jsonObject.getString("textKey"); // 获取字符串值 // 创建响应对象 JSONObject response = new JSONObject(); response.put("status", "success"); return response; } ``` 该方法通过阿里巴巴的`JSONObject`实现精确类型转换,需要引入`fastjson`依赖[^3]。 ### 三、注意事项 1. **请求头设置**:必须设置`Content-Type: application/json` 2. **参数校验**:推荐在获取值后添加空值校验 3. **依赖要求**:Spring Boot默认支持Jackson,使用`JSONObject`需额外添加依赖 ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> ``` ### 测试示例(Postman) ```json { "age": 25, "username": "testUser" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值