gpt4 book ai didi

json - 注册自定义 JSON 编码器

转载 作者:行者123 更新时间:2023-12-02 15:24:12 26 4
gpt4 key购买 nike

在我的 Grails 2.5.0 应用程序中,我使用了一组自定义 JSON 编码器来严格控制由我的 REST 端点返回的 JSON 格式。目前我在这样的服务中注册这些编码器

class MarshallerRegistrarService {

static transactional = false

LinkGenerator grailsLinkGenerator

// a combination of eager bean initialization and @PostConstruct
// ensures that the marshallers are registered when the app (or
// a test thereof) starts
boolean lazyInit = false

@PostConstruct
void registerMarshallers() {

// a collection of Enums that can be rendered to JSON
def jsonEnums = [PaymentFrequency, Operation]

jsonEnums.each { Class enumType ->
JSON.registerObjectMarshaller(enumType) { Enum enumValue ->
enumValue.toString()
}
}

JSON.registerObjectMarshaller(TimelineItem) { TimelineItem timelineItem ->
def domainInstance = timelineItem.item

return [
date: timelineItem.date,
type: domainInstance.class.simpleName,
item: [id: domainInstance.id],
link: grailsLinkGenerator.link(absolute: true, mapping: 'downloadForm', params: [apiVersion: 'v1', id: domainInstance.id])
]
}

JSON.registerObjectMarshaller(Date) {

TimeZone tz = TimeZone.getTimeZone('UTC')
def formatted = it?.format("yyyy-MM-dd'T'HH:mm:ss'Z'", tz)
return formatted
}

// more marshallers registered here (much more!)
}
}

这种方法的原因之一是我可以在呈现 JSON 时访问 spring bean(例如 grailsLinkGenerator )。

然而,一些缺点是:
  • 在方法体内定义和注册编码器使它们难以测试
  • registerMarshallers随着编码器数量的增加,方法很快就会失控

  • 我更愿意在它自己的类中定义每个编码器并将其注册为 resources.groovy 中的 Spring bean , 这可能吗?

    最佳答案

    当然你可以做到:-)
    让你所有的编码员@Component并在实例化期间或之后使用 JSON 注册它们。另一种方法是使它们 @Component并用接口(interface)或基类标记它们,并在引导/插件初始化期间注册它们,如下所示:

    ctx.getBeansOfType(MarshallerBase).each { name, bean ->
    bean.registerMarshallers()
    }

    假设每个编码器都实现了 registerMarshallers()方法。
    不过,还有更多的方法。

    关于json - 注册自定义 JSON 编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527164/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com