我正在开发基于REST的界面,人们可以在其中获取json文件.客户端需要从另一个域访问该文件.我使用到目前为止工作的jsonp.我的问题是Grails中的渲染.目前我使用'as JSON'来编组对象:
render "${params.jsoncallback}(${user as JSON})"
进入客户端的Json文件包含所有属性,包括id和class,我不想在那里.如果它不是jsonp,我这样做,这很好用:
render(contentType:'text/json'){ userName user.userName userImage user.userImage : : }
那么在将"user as JSON"渲染时,如何从json中获取id和class属性?任何的想法?
最好的问候,克拉斯
您可以通过创建自定义ObjectMarshaller来删除JSON结果中的类和id属性.
// CustomDomainMarshaller.groovy in src/groovy: import grails.converters.JSON; import org.codehaus.groovy.grails.web.converters.ConverterUtil; import org.codehaus.groovy.grails.web.converters.exceptions.ConverterException; import org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller; import org.codehaus.groovy.grails.web.json.JSONWriter; import org.springframework.beans.BeanUtils; public class CustomDomainMarshaller implements ObjectMarshaller{ static EXCLUDED = ['metaClass','class','id','version'] public boolean supports(Object object) { return ConverterUtil.isDomainClass(object.getClass()); } public void marshalObject(Object o, JSON json) throws ConverterException { JSONWriter writer = json.getWriter(); try { writer.object(); def properties = BeanUtils.getPropertyDescriptors(o.getClass()); for (property in properties) { String name = property.getName(); if(!EXCLUDED.contains(name)) { def readMethod = property.getReadMethod(); if (readMethod != null) { def value = readMethod.invoke(o, (Object[]) null); writer.key(name); json.convertAnother(value); } } } writer.endObject(); } catch (Exception e) { throw new ConverterException("Exception in CustomDomainMarshaller", e); } } }
您需要在grails-app/conf/BootStrap.groovy中注册:
class BootStrap { def init = { servletContext -> grails.converters.JSON.registerObjectMarshaller(new CustomDomainMarshaller()) } def destroy = {} }
这应该在Grails> = 1.1中有效