You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中无法在ResponseEntity中正确返回JSONObject

问题分析与解决方案

问题原因

你遇到的问题源于Spring默认的JSON序列化器(Jackson)对JSONObject的处理逻辑:它会将JSONObject作为普通Java对象序列化,输出其暴露的公共属性(比如empty、mapType),而非内部存储的键值对。尽管调试时能看到JSONObject的正确内容,但序列化过程只识别对象getter方法暴露的属性。

解决方案

方案1:替换JSONObject为HashMap(推荐)

直接使用Java标准HashMap替代JSONObject,Spring对标准集合类的序列化逻辑能直接输出正确的键值对结构,代码修改如下:

HashMap<String, Object> hashMap = new HashMap<>();
HashMap<String, Object> hashMap2 = new HashMap<>();
// 用HashMap替代JSONObject
HashMap<String, Object> jsonMap = new HashMap<>();
jsonMap.put("key", "dummy value");

hashMap2.put("key", "dummy value");
hashMap2.put("new key", jsonMap);
hashMap.put("data", jsonMap);
hashMap.put("data2", hashMap2);
hashMap.put("extra field", "extra value");

return new ResponseEntity<>(hashMap, HttpStatusCode.valueOf(200));

方案2:手动转换JSONObject为可序列化结构

如果必须保留JSONObject,可将其转换为Map后再放入返回集合(以Alibaba FastJSON的JSONObject为例,它提供toMap()方法):

HashMap<String, Object> hashMap = new HashMap<>();
HashMap<String, Object> hashMap2 = new HashMap<>();
JSONObject jsonObject = new JSONObject();
jsonObject.put("key", "dummy value");

hashMap2.put("key", "dummy value");
// 将JSONObject转成Map再放入
hashMap2.put("new key", jsonObject.toMap());
hashMap.put("data", jsonObject.toMap());
hashMap.put("data2", hashMap2);
hashMap.put("extra field", "extra value");

return new ResponseEntity<>(hashMap, HttpStatusCode.valueOf(200));

方案3:配置Jackson全局自定义序列化器(复杂场景)

若需全局统一处理JSONObject的序列化,可自定义Jackson序列化器并注册:

// 自定义序列化器
public class JSONObjectSerializer extends StdSerializer<JSONObject> {
    public JSONObjectSerializer() {
        super(JSONObject.class);
    }

    @Override
    public void serialize(JSONObject jsonObject, JsonGenerator gen, SerializerProvider provider) throws IOException {
        // 直接写入JSONObject的内部键值对
        gen.writeObject(jsonObject.getInnerMap());
    }
}

注册到Jackson配置中:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(JSONObject.class, new JSONObjectSerializer());
        mapper.registerModule(module);
        return mapper;
    }
}

配置完成后,所有JSONObject都会被正确序列化为内部的键值对结构。


内容的提问来源于stack exchange,提问作者Ankit Kumar Maurya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:27:45