【问题标题】:Grails: JSONP callback without id and class in JSON fileGrails:JSON 文件中没有 id 和类的 JSONP 回调
【发布时间】:2010-12-14 14:43:35
【问题描述】:

我正在开发基于 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 属性?有什么想法吗?

最好的问候, 克拉斯

【问题讨论】:

  • 请检查 here 在 JSON 响应中呈现选择性字段

标签: class rest grails jsonp


【解决方案1】:

您可以通过创建自定义 ObjectMarshaller 来摆脱 JSON 结果中的 class 和 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<JSON> {

    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 中工作

【讨论】:

  • 这似乎不适用于控制器单元测试。有什么想法吗?
  • 我认为仅使用响应中所需的属性来定义 DTO 可能会更简单。然后将 DTO 渲染为 JSON。
【解决方案2】:

感谢您的“快速”回复!

伙计,最后看起来很容易,却花了很长时间才弄清楚。 我让它根据我需要的值绘制地图并将它们呈现为“json”,如下所示:

def userProfile = user.get(randomUser)

def jsonData = [
用户名:userProfile.userName,
用户图像:userProfile.userImage,
用户街:userProfile.userStreet,
:
:
] 作为 JSON

println jsonData

瞧,有我需要的 json :)

【讨论】:

    【解决方案3】:

    在我看来,JSON 自动编组器似乎不支持这一点。

    您可以使用FlexJSON,它允许您排除某些属性并将其包装到custom Codec 中。 另见here。

    【讨论】:

      猜你喜欢
      • 2012-06-25
      • 2013-04-25
      • 2012-01-02
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2017-09-28
      • 2013-02-16
      相关资源
      最近更新 更多