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
相关产品推荐
相关产品推荐

