将grails域对象转换为JSON并对其进行操作
我有一个grails对象,我正在使用将grails域对象转换为JSON并对其进行操作,json,grails,Json,Grails,我有一个grails对象,我正在使用defjson=objectasjson转换它。转换后,我想在JSON中再添加一个名为pin的属性,如下所示 [location:[lat:23.03, lon:72.58]] 到目前为止,唯一能做到这一点的方法似乎如下 使用grails.converters.JSON将DomainClass序列化为JSON 将JSON转换为字符串 使用步骤2中的字符串创建JSONBoject 添加属性 将其转换回字符串 使用grails.converters.json还有
defjson=objectasjson
转换它。转换后,我想在JSON中再添加一个名为pin
的属性,如下所示
[location:[lat:23.03, lon:72.58]]
到目前为止,唯一能做到这一点的方法似乎如下
domainInstance.properties + [pin: pinInstance] as JSON
我最近需要做一件类似的事情。一些警告:
- 这是在使用Grails2.4.5
- 我使用MongoDB作为后端。因此,我为MongoDB域类创建了一个对象封送器。它打印在下面,您可以为您的域类包装一个类似的封送拆收器:
class MongodbObjectMarshaller implements ObjectMarshaller<JSON> {
@Override
boolean supports(Object o) { return o?.properties?.dbo }
@Override
void marshalObject(Object obj, JSON converter) throws
ConverterException {
Map propertiesToOutput = obj.properties.dbo
propertiesToOutput.remove("_id") //don't print org.bson.types.ObjectId
propertiesToOutput.remove("version") //don't print gorm verson column
converter.build {
_id obj.id.toString()
propertiesToOutput.each{ entry ->
"$entry.key" entry.value
}
}
}
}
因为我的封送员现在提取pin属性并打印它。这会将pin添加为域实例的一部分吗?不会。但是您真的需要将域与其他字段合并吗?如果是这样,也许将此字段添加到域类会更好?或者在其中创建一个代理字段,为
pin
提供一个getter?这是我第一次尝试,我在域类中添加了lat和lon,并创建了public getPin(){['location':[lat:lat,lon:lon]}
方法,但当我将对象作为JSON
时,pin不在JSON的字符串表示形式中。Had查看了org.codehaus.groovy.grails.web.converters.marshaller.JSON.DomainClassMarshaller
的源代码,发现只有域类的持久属性被封送到JSON。因此,获取具有自定义结构的JSON的最直接的方法是创建一个映射并对其进行编组?
domainInstance.pin = [location:[lat:23.03, lon:72.58]]
def content = tacticalCard as JSON