如何在Spring Boot中使用org.json.JSONObject作为接口返回类型?
org.json.JSONObject的序列化问题 你遇到的问题核心在于Spring Boot默认的Jackson实例没有注册JsonOrgModule,导致无法正确序列化org.json.JSONObject对象,转而序列化了它的内部属性(比如empty字段)。下面是具体的解决方案:
1. 确认依赖版本对齐
首先确保你引入的jackson-datatype-json-org版本和Spring Boot自带的Jackson版本一致,避免版本冲突。比如Spring Boot 2.6.x对应Jackson 2.13.x,Spring Boot 3.x对应Jackson 2.15+,你当前的版本是匹配的,但如果后续升级框架,记得同步调整这个依赖的版本。
2. 全局注册JsonOrgModule到Spring的ObjectMapper
Spring Boot确实维护了一个全局的ObjectMapper实例,我们可以通过配置类让框架自动加载JsonOrgModule,有两种推荐方式:
方式一:使用Jackson2ObjectMapperBuilderCustomizer(推荐)
这是Spring Boot官方推荐的自定义Jackson配置的方式,它会自动融入框架的现有配置:
import com.fasterxml.jackson.datatype.jsonorg.JsonOrgModule; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonJsonOrgConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer jsonOrgModuleCustomizer() { return builder -> builder.modules(new JsonOrgModule()); } }
方式二:直接注册自定义ObjectMapper Bean
如果你需要更精细的控制,可以直接创建一个ObjectMapper Bean并注册模块:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsonorg.JsonOrgModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonJsonOrgConfig { @Bean public ObjectMapper objectMapper() { return new ObjectMapper() .registerModule(new JsonOrgModule()); } }
3. 验证效果
完成配置后,你的接口不需要修改返回类型(依然保留org.json.JSONObject),也不需要手动创建ObjectMapper,Spring Boot会自动使用已经注册了模块的全局实例来序列化返回值,现在接口应该能正确返回你构建的JSON内容,而不是{"empty":false}了。
补充说明
你之前手动创建ObjectMapper无效的原因是:Spring Boot在处理@ResponseBody时,使用的是它自己容器中管理的全局ObjectMapper实例,而你手动创建的那个并没有被框架使用,所以必须通过配置类将模块注册到框架的实例中。
内容的提问来源于stack exchange,提问作者OmerHalit

