您可以使用https://github.com/google/gson 序列化/反序列化您的类,并设置字段命名策略:
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
这意味着您应该将请求/响应正文作为文本获取,而不是依赖 Grails 提供的自动 json 反序列化。
另一个选项(至少对于您的响应)是注册自定义 JSON 编组器。您可以在 bootstrap.groovy 中执行此操作。在下面的示例代码中,我实现了一个标记接口,以便可以显式指定应该序列化为蛇形案例的对象。
interface SnakeCase {
}
要导出为蛇形案例的域对象实现此接口
class Person implements SnakeCase {
String surname
String firstName
String middleNames
String someOtherField
static constraints = {
}
}
然后在 bootstrap.groovy 中注册一个自定义 JSON 编组器
class BootStrap {
def grailsApplication
def init = { servletContext ->
JSON.registerObjectMarshaller(SnakeCase, { SnakeCase o ->
def result = [:]
if (grailsApplication.isDomainClass(o.class)) {
o.domainClass.persistentProperties.each { GrailsDomainClassProperty p ->
def name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, p.name)
result[name] = o[p.name]
}
} else {
o.properties.each {
def name = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, it.key as String)
result[name] = it.value
}
}
return result
})
}
def destroy = {
}
}
请注意,grails 域类和常规 POGO 类之间存在区别。您还可以添加黑/白名单机制,以更好地控制哪些属性被序列化。此示例使用 Guava CaseFormat 实用程序来执行实际的蛇形外壳
注册此编组器后,只需在控制器方法中使用 JSON 格式化程序即可
def ajaxListPeople() {
def list = Person.list();
render(list as JSON)
}