spring boot:使用fastJson解析json数据

本文介绍如何在SpringBoot项目中集成FastJson JSON解析库,包括配置方法及使用技巧。

如果我们想在spring boot中使用第三方的json解析框架:

1)我们需要在pom.xml文件中引入第三方包的依赖;

2)实现方法:

方法1 需要在启动类中继承WebMvcConfigurerAdapter 类,并重写该类的configureMessageConverters方法。

方法2. 我们直接使用@Bean注入第三方的 解析框架。

 

1、引入fastJson的依赖库

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.15</version>
</dependency>

在1.2.10版本后会有两个方法支持HttpMessageconvert,一个是FastJsonHttpMessageConvert,支持4.2以下版本;

一个是FastJsonHttpMessageConvert4,支持4.2以上版本。

 

2、配置fastJson(支持两种方法)

(1) 方法一:

  <1> 启动类继承 WebMvcConfigurerAdapter 类;

  <2> 覆盖方法 configureMessageConverters;

①  启动类代码如下:

复制代码
@SpringBootApplication
public class App extends WebMvcConfigurerAdapter
{

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
    {
        super.configureMessageConverters(converters);
        /*
         * 1、需要先定义一个 convert 转换消息对象;
         * 2、添加 fastJson 的配置信息,比如: 是否要格式化返回的Json数据;
         * 3、在 Convert 中添加配置信息;
         * 4、将 convert 添加到 converts 中;
         */

        //1、需要先定义一个 convert 转换消息对象;
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        //2、添加 fastJson 的配置信息,比如: 是否要格式化返回的Json数据;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);

        //3、在 Convert 中添加配置信息;
        fastConverter.setFastJsonConfig(fastJsonConfig);

        //4、将 convert 添加到 converts 中;
        converters.add(fastConverter);

    }

    public static void main(String[] args)
    {
        /*
         * 在main方法中进行启动App类的应用程序
         */
        SpringApplication.run(App.class, args);
    }
}
复制代码

 

② Controller的接口代码如下:

 

复制代码
@RestController
public class HelloController
{/**
     * 返回的JSON数据
     * @return
     */
    @RequestMapping("/getDemo")
    public Demo getDemo()
    {
        Demo demo = new Demo();
        demo.setId(1);
        demo.setName("zhangsan");
        demo.setCreateTime(new Date());
        return demo;
    }
}
复制代码

 

 

③ 测试代码:

在Demo实体类中的createTime属性,使用 @JSONField 注解格式化Date类型为"yyyy-MM-dd HH:mm:ss"的格式;如下所示:

 

复制代码
public class Demo
{
    private int id;
    private String name;

    //注解使用的包: com.alibaba.fastjson.annotation.JSONField
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;//创建时间

    //getter 和 setter 方法省略
}
复制代码

 

在浏览器中打开 http://localhost:8080/getDemo :

若返回的json数据中 "createTime" 的格式为:yyyy-MM-dd HH:mm:ss,则表示使用的是配置的fastJson处理的数据,否则表示的配置的fastJson不生效。

 

 

(2) 方法二:

  <1> 在启动类中注入Bean:HttpMessageConverters

启动类的代码如下:

复制代码
@SpringBootApplication
public class App
{
    /**
     * 使用 @Bean 注入 FastJsonHttpMessageConverter
     * @return
     */
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters()
    {
        //1、需要先定义一个 convert 转换消息对象;
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        //2、添加 fastJson 的配置信息,比如: 是否要格式化返回的Json数据;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);

        //3、在 Convert 中添加配置信息;
        fastConverter.setFastJsonConfig(fastJsonConfig);

        //4、
        HttpMessageConverter<?> converter = fastConverter;
        return new HttpMessageConverters(converter);
    }

    public static void main(String[] args)
    {
        /*
         * 在main方法中进行启动App类的应用程序
         */
        SpringApplication.run(App.class, args);
    }
}
复制代码

 

 3、 fastJson的一些使用方法

 (1)格式化日期格式:

    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;//创建时间

(2)若不想让接口返回一个属性,则设置 @JSONFieldserialize 属性为false(不进行序列化);

    /*
     * 不想返回该属性, serialize:是否进行序列化
     */
    @JSONField(serialize = false)
    private String remarks;//备注信息
<think>好的,用户现在想了解如何使用Fastjson返回JSON数据。首先,我需要回顾一下之前用户的提问历史。之前他们遇到了关于dataService类未注册的问题,可能是在Spring项目中遇到的问题,现在转向了JSON数据的处理,可能是同一个项目中的需求。 用户的问题比较直接,但需要详细解答。首先,我需要确定他们是否在使用Spring框架,因为不同的框架(如Spring MVC或Spring Boot)返回JSON的方式可能不同,而Fastjson作为阿里巴巴的库,通常用来替代默认的Jackson。 接下来,我需要考虑用户可能的场景。他们可能在开发一个Web应用,需要将Java对象转换为JSON返回给前端。可能遇到的问题括依赖配置错误、注解使用不当或日期格式处理等。用户可能已经尝试过默认的Jackson,但希望切换为Fastjson,或者需要更高性能的JSON库。 然后,我需要整理回答的结构。首先介绍基本用法,比如如何将对象转换为JSON字符串。然后,结合Spring框架,说明如何配置Fastjson作为消息转换器。同时,要提醒用户注意依赖冲突,确保正确引入Fastjson,并排除默认的Jackson,如果存在的话。 还要提到常见问题,比如循环引用、日期格式化、字段过滤等,这些是实际开发中经常遇到的。给出示例代码和配置步骤,确保用户能够一步步操作。此外,可能需要对比Fastjson和其他库的优缺点,但用户主要关注使用方法,所以重点放在配置和示例上。 需要注意用户可能对Spring的配置不熟悉,尤其是如何替换默认的转换器。需要详细说明在Spring Boot中如何通过继承WebMvcConfigurer来添加自定义的HttpMessageConverter。同时,强调注解的使用,比如@JSONField,用于自定义字段名称和格式。 最后,要检查是否有遗漏的部分,比如版本兼容性问题,或者常见的错误配置,比如忘记排除Jackson导致转换器冲突。确保提供的代码示例准确,特别是导入和配置类的正确写法。可能还需要提醒用户查看官方文档,以获取最新的配置方法,因为库的更新可能会导致配置方式的变化。</think>--- ### FastJSON返回JSON数据完整指南 使用阿里巴巴开源的FastJSON进行JSON数据处理时,主要涉及 **序列化**(Java对象转JSON)和 **反序列化**(JSON转Java对象)两个核心操作。以下是具体实现方案: --- #### 一、基础环境配置 1. **添加Maven依赖** ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.39</version> <!-- 使用最新稳定版本 --> </dependency> ``` 2. **Spring Boot中排除默认JSON库**(可选) 若需要完全替换Jackson,在`pom.xml`添加: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </exclusion> </exclusions> </dependency> ``` --- #### 二、基础序列化操作 ```java // 创建Java对象 public class User { private String username; private int age; // 必须提供getter/setter方法 } // 序列化操作 User user = new User(); user.setUsername("John"); user.setAge(25); // 转换为JSON字符串(标准模式) String jsonString = JSON.toJSONString(user); // 输出结果:{"age":25,"username":"John"} // 美化输出(带缩进) String prettyJson = JSON.toJSONString(user, SerializerFeature.PrettyFormat); ``` --- #### 三、与Spring框架集成 ##### 1. 配置FastJSON消息转换器(Spring MVC) ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 创建FastJSON转换器 FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); // 配置序列化规则 FastJsonConfig config = new FastJsonConfig(); config.setSerializerFeatures( SerializerFeature.WriteMapNullValue, // 保留null字段 SerializerFeature.WriteDateUseDateFormat, // 日期格式化 SerializerFeature.PrettyFormat // 美化输出 ); config.setDateFormat("yyyy-MM-dd HH:mm:ss"); // 日期格式 converter.setFastJsonConfig(config); converters.add(0, converter); // 优先使用FastJSON } } ``` ##### 2. Controller层使用示例 ```java @RestController public class UserController { // 直接返回对象即可自动转换 @GetMapping("/user") public User getUser() { return new User("Alice", 28); } // 返回复杂结构 @GetMapping("/users") public Map<String, Object> getUsers() { Map<String, Object> result = new HashMap<>(); result.put("code", 200); result.put("data", Arrays.asList( new User("Bob", 30), new User("Charlie", 22) )); return result; } } ``` --- #### 四、高级特性配置 ##### 1. 自定义字段名称与忽略字段 ```java public class Product { @JSONField(name = "product_name") // 自定义JSON字段名 private String productName; @JSONField(serialize = false) // 忽略该字段 private String secretKey; // 其他字段... } ``` ##### 2. 日期格式化处理 ```java public class Order { @JSONField(format = "yyyy/MM/dd") private Date createTime; // 若未指定格式,使用全局配置的日期格式 private Date updateTime; } ``` ##### 3. 处理循环引用 ```java // 在序列化时配置 String json = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect // 关闭循环引用检测 ); ``` --- #### 五、常见问题排查 | 问题现象 | 解决方案 | |------------------------------|--------------------------------------------------------------------------| | 返回HTML而不是JSON | 检查`@RestController`注解是否正确,或方法是否误用`@Controller` | | 日期字段显示为时间戳 | 确认是否配置`SerializerFeature.WriteDateUseDateFormat`及日期格式 | | 字段值为null时未显示 | 启用`SerializerFeature.WriteMapNullValue` | | 中文乱码 | 在消息转换器中设置`SupportedMediaType.APPLICATION_JSON_UTF8` | | 复杂对象转换失败 | 检查是否所有嵌套对象都实现序列化接口,或使用`@JSONType`注解配置 | --- #### 六、性能优化建议 1. **重用JSON实例** ```java // 创建全局配置实例 private static final FastJsonConfig config = new FastJsonConfig(); // 复用Parser和Serializer JSON.parseObject(jsonString, User.class, config.getParserConfig()); ``` 2. **关闭冗余特性** ```java config.setSerializerFeatures( SerializerFeature.WriteNullListAsEmpty, // 仅开启必要特性 SerializerFeature.WriteNullStringAsEmpty ); ``` 3. **使用`JSONPath`进行高效查询** ```java String jsonStr = "{'store':{'book':[{'price':35.6}]}}"; Object price = JSONPath.eval(jsonStr, "$.store.book[0].price"); // 35.6 ``` --- 通过合理配置FastJSON,可以实现比原生Jackson **快2-3倍** 的序列化速度(根据官方基准测试)。建议根据实际业务需求选择合适的序列化策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值