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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:35:15