我正在开发基于REST的界面,人们可以在其中获取json文件。客户端需要从另一个域访问该文件。我使用到目前为止工作的jsonp。我的问题是Grails中的渲染。目前我使用'as JSON'来编组对象:
render "${params.jsoncallback}(${user as JSON})"
访问客户端的Json文件包含所有属性,包括 id 和类,我不希望在那里。如果它不是jsonp,我会这样做,这很有效:
render(contentType:'text/json'){
userName user.userName
userImage user.userImage
:
:
}
那么在将“user as JSON”渲染时,如何从json中获取id和class属性?有什么想法吗?
最好的问候, 克拉斯
答案 0 :(得分:5)
您可以通过创建自定义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-app / conf / BootStrap.groovy中注册:
class BootStrap {
def init = { servletContext ->
grails.converters.JSON.registerObjectMarshaller(new CustomDomainMarshaller())
}
def destroy = {}
}
这应该适用于Grails&gt; = 1.1
答案 1 :(得分:2)
感谢'快速'回复!
男人,最终看起来很容易,花了很长时间才弄明白。 我让它正在根据我需要的值做一个地图并像'json'那样渲染它们:
def userProfile = user.get(randomUser)
def jsonData = [
username:userProfile.userName,
userimage:userProfile.userImage,
userstreet:userProfile.userStreet,
:
:
]作为JSON
println jsonData
瞧,我需要的是json:)答案 2 :(得分:0)
在我看来,好像JSON自动编组器支持这一点。
您可以使用FlexJSON,它允许您排除某些属性并将其包装到custom Codec中。 另请参阅here。