REST服务输出中相同JSON内容为何被省略?
问题分析与解决方案
嘿,这个问题我之前在项目里碰到过类似的情况,大概率和对象引用重复或者JSON序列化工具的默认配置有关——内容相同只是触发这个现象的诱因,本质不是内容相同本身导致的省略。
常见原因拆解
重复对象引用:如果你是把同一个查询结果对象直接存到Map的两个键下,比如:
List<YourModel> queryResult = yourRepository.findXXX(); resultMap.put("firstKey", queryResult); resultMap.put("secondKey", queryResult);这种情况下,Map里的两个值其实指向同一个内存对象。像Jackson这类主流JSON序列化库,默认会检测重复引用的对象,为了避免冗余输出或者循环引用问题,会把后续出现的重复引用替换成
...。序列化工具的重复内容检测:就算你是执行了两次独立查询,但如果返回的对象内容完全一致(甚至连对象引用都不同,但属性值全一样),部分序列化工具的严格模式下也会判定为重复内容,从而省略输出。
对应的解决办法
确保对象引用独立
如果是重复引用的问题,你需要为每个Map键生成独立的对象实例,比如手动复制属性或者用Bean拷贝工具:List<YourModel> result1 = yourRepository.findXXX(); // 用BeanUtils或者手动拷贝生成新的对象列表 List<YourModel> result2 = result1.stream() .map(model -> { YourModel newModel = new YourModel(); newModel.setId(model.getId()); newModel.setName(model.getName()); // 拷贝所有需要的属性 return newModel; }) .collect(Collectors.toList()); resultMap.put("firstKey", result1); resultMap.put("secondKey", result2);调整序列化工具配置
以Spring Boot常用的Jackson为例,可以关闭重复引用检测的特性:- 代码层面配置:
@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 关闭重复引用检测 mapper.disable(SerializationFeature.USE_EQUALITY_FOR_OBJECT_ID); return mapper; } - 配置文件层面(application.properties):
spring.jackson.serialization.use-equality-for-object-id=false
- 代码层面配置:
内容的提问来源于stack exchange,提问作者user697911
相关产品推荐
相关产品推荐

