是否有内置/简单的方法来设置域类属性和没有与属性名称完全匹配的JSON字符串之间的映射?
例如,当我有域类时:
class Person {
String jobTitle
String favoriteColor
static constraints = {
jobTitle(blank: false)
favoriteColor(blank: false)
}
}
有人给了我以下JSON:
{ "currentJob" : "secret agent", "the-color" : "red" }
我希望能够做到这一点:
new Person(request.JSON).save()
在groovy / grails中有没有办法让我映射currentJob - > jobTitle和the-color - >最喜欢的颜色?
修改
我做了一点实验,但我还没有完成它。但我发现了一些有趣的事情......
起初我尝试覆盖setProperty方法:
@Override
setProperty(String name, Object value) {
if(this.hasProperty(name)) this[name] = value
else {
switch(name) {
'currentJob': this.jobTitle = value; break;
'the-color': this.favoriteColor = value; break;
}
}
}
但是这不起作用有两个原因:1)只有当一个属性与name匹配时才调用setProperty 2)“this [name] = value”调用setProperty,导致无限递归循环。
然后我想,好吧搞砸了,我知道传入的json字符串是什么样的(如果我只能控制它),我就会摆脱处理名称匹配的场景的行,而我ll覆盖hasProperty,也许这将起作用:
@Override
void setProperty(String name, Object value) {
switch(name) {
'currentJob': this.jobTitle = value; break;
'the-color': this.favoriteColor = value; break;
}
}
@Override
boolean hasProperty(String name) {
if(name == "currentJob" || name == "the-color") return true
return false
}
但不,那也不起作用。通过随机的运气我发现,我不仅要覆盖hasProperty(),而且还必须为该属性设置一个空的setter。
void setCurrentJob(){ }
该hack适用于currentJob - 我想只有当hasProperty返回true并且该属性有一个setter时才会调用setProperty(即使该setter是在grails的封面下自动生成的)。不幸的是,由于短划线我无法创建“setThe-Color”功能,所以这个解决方案对我不起作用。
仍然坚持这一点,任何帮助肯定会受到赞赏。
修改
覆盖void propertyMissing(String name,Object value){}方法由此调用:
Person person = new Person()
person["currentJob"] = "programmer"
person["the-color"] = "red"
但不是这样:
Person person = new Person(["currentJob":"programmer", "the-color":"red"])