Class Grails:JSON文件中没有id和类的JSONP回调
我正在开发一个基于REST的界面,人们可以从中获得一个json文件。客户端需要从另一个域访问该文件。我使用到目前为止有效的jsonp。我的问题是Grails中的渲染。目前,我使用“as JSON”来编组对象:Class Grails:JSON文件中没有id和类的JSONP回调,class,rest,grails,jsonp,Class,Rest,Grails,Jsonp,我正在开发一个基于REST的界面,人们可以从中获得一个json文件。客户端需要从另一个域访问该文件。我使用到目前为止有效的jsonp。我的问题是Grails中的渲染。目前,我使用“as JSON”来编组对象: render "${params.jsoncallback}(${user as JSON})" 到达客户端的Json文件包含了所有属性,包括id和类,我不想在其中包含这些属性。如果不是jsonp,我会这样做,效果很好: render(contentType:'text/json'){
render "${params.jsoncallback}(${user as JSON})"
到达客户端的Json文件包含了所有属性,包括id和类,我不想在其中包含这些属性。如果不是jsonp,我会这样做,效果很好:render(contentType:'text/json'){
userName user.userName
userImage user.userImage
:
:
}
那么,在呈现“用户为json”时,如何从json中获取id和类属性呢?有什么想法吗
致以最良好的祝愿,
Klaas在我看来,JSON自动封送器似乎不支持这一点 您可以使用它,它允许您排除某些属性并将其包装到一个文件中。
另请参见。您可以通过创建自定义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<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>=1.1中使用,谢谢您的“快速”回复 老兄,最后看起来很容易,花了很长时间才弄明白。 我用我需要的值做了一个映射,并将它们呈现为“json”,如下所示: def userProfile=user.get(随机用户) def jsonData=[
用户名:userProfile.username,
userimage:userProfile.userimage,
userstreet:userProfile.userstreet,
:
:
]作为JSON println-jsonData
瞧,这里有我需要的json:)这在控制器单元测试中似乎不起作用。有什么想法吗?我认为在响应中定义一个只包含您想要的属性的DTO可能更简单。然后将DTO呈现为JSON。请检查以在JSON响应中呈现选择性字段
class BootStrap {
def init = { servletContext ->
grails.converters.JSON.registerObjectMarshaller(new CustomDomainMarshaller())
}
def destroy = {}
}