Groovy中JsonOutput.toJson未输出failures列表的原因及解决方法
Groovy序列化Status类时failures字段未输出的解决方案
问题原因
Groovy的JsonOutput.toJson()默认遵循JavaBean规范,仅会序列化存在对应getter方法的类字段。你的Status类中,failures字段仅定义了addFailure()添加方法,没有提供getFailures()这样的读取方法,因此序列化时该字段被自动忽略。
解决方案
1. 为failures字段添加getter方法
这是最直接的方案,给failures字段添加标准的getter方法:
public class Status { private EnumStatus myStatus = EnumStatus.GREY private List<String> failures = [] // 原有构造方法、setStatus、addFailure方法保持不变 // 添加failures的getter public List<String> getFailures() { return failures } }
添加后重新执行序列化,failures字段就会被包含在JSON输出中。
2. 使用Groovy注解自动生成getter
Groovy提供@Canonical注解,可自动为类中所有字段生成getter/setter、toString等方法,简化代码:
import groovy.transform.Canonical @Canonical public class Status { private EnumStatus myStatus = EnumStatus.GREY private List<String> failures = [] public Status(EnumStatus status, List<String> failureList) { myStatus = status failures = failureList } public void addFailure(String failure) { failures.add(failure) } }
注解会自动生成getFailures()方法,无需手动编写即可实现字段序列化。
3. 自定义JsonGenerator控制序列化逻辑
如果不想修改原类结构,可以通过自定义JsonGenerator来指定Status类的序列化规则:
import groovy.json.JsonGenerator import groovy.json.JsonOutput // 创建自定义生成器 def customGenerator = new JsonGenerator.Options() .addConverter(Status) { status -> // 手动指定要序列化的字段和值 [ status: status.getStatus(), failures: status.failures ] } .build() // 使用自定义生成器序列化Map String jsonResult = customGenerator.toJson(myMap) println jsonResult
这种方式完全自定义序列化逻辑,适合需要灵活控制输出内容的场景。
验证效果
修改后执行序列化,输出的JSON会包含failures字段:
{"myId11":{"status":"GREY","failures":[]},"myId12":{"status":"RED","failures":["myFailure"]}}
内容的提问来源于stack exchange,提问作者amestin
相关产品推荐
相关产品推荐

