当前位置:  开发笔记 > 前端 > 正文

Grails:在JSON文件中没有id和类的JSONP回调

如何解决《Grails:在JSON文件中没有id和类的JSONP回调》经验,为你挑选了1个好方法。

我正在开发基于REST的界面,人们可以在其中获取json文件.客户端需要从另一个域访问该文件.我使用到目前为止工作的jsonp.我的问题是Grails中的渲染.目前我使用'as JSON'来编组对象:

render "${params.jsoncallback}(${user as JSON})"

进入客户端的Json文件包含所有属性,包括idclass,我不想在那里.如果它不是jsonp,我这样做,这很好用:

render(contentType:'text/json'){
   userName  user.userName
   userImage user.userImage
    :
    :
}

那么在将"user as JSON"渲染时,如何从json中获取id和class属性?任何的想法?

最好的问候,克拉斯



1> Siegfried Pu..:

您可以通过创建自定义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中有效

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有