vij*_*agi 8 grails groovy json
我正在尝试注册这样的自定义json marshaller
JSON.createNamedConfig("dynamic",{
def m = new CustomJSONSerializer()
JSON.registerObjectMarshaller(Idf, 1, { instance, converter -> m.marshalObject(instance, converter) })
})
and then using it like this
JSON.use("dynamic"){
render inventionList as JSON
}
Run Code Online (Sandbox Code Playgroud)
但我不确定我的自定义序列化程序是否正在使用,因为当我调试控件时,永远不会marshalObject使用我的自定义序列化程序
我的自定义序列化程序如下
import grails.converters.deep.JSON
import java.beans.PropertyDescriptor
import java.lang.reflect.Field
import java.lang.reflect.Method
import org.codehaus.groovy.grails.web.converters.exceptions.ConverterException
import org.codehaus.groovy.grails.web.converters.marshaller.json.GroovyBeanMarshaller
import org.codehaus.groovy.grails.web.json.JSONWriter
class CustomJSONSerializer extends GroovyBeanMarshaller{
public boolean supports(Object object) {
return object instanceof GroovyObject;
}
public void marshalObject(Object o, JSON json) throws ConverterException {
JSONWriter writer = json.getWriter();
println 'properties '+BeanUtils.getPropertyDescriptors(o.getClass())
for(PropertyDescriptor property:BeanUtils.getProperyDescriptors(o.getClass())){
println 'property '+property.getName()
}
try {
writer.object();
for (PropertyDescriptor property : BeanUtils.getPropertyDescriptors(o.getClass())) {
String name = property.getName();
Method readMethod = property.getReadMethod();
if (readMethod != null && !(name.equals("metaClass")) && readMethod.getName()!='getSpringSecurityService') {
Object value = readMethod.invoke(o, (Object[]) null);
writer.key(name);
json.convertAnother(value);
}
}
for (Field field : o.getClass().getDeclaredFields()) {
int modifiers = field.getModifiers();
if (Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) {
writer.key(field.getName());
json.convertAnother(field.get(o));
}
}
writer.endObject();
}
catch (ConverterException ce) {
throw ce;
}
catch (Exception e) {
throw new ConverterException("Error converting Bean with class " + o.getClass().getName(), e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以调试序列化器?如果没有,那么如何从序列化中排除属性?有一些属性在序列化期间抛出异常.
这是我在Bootstrap初始化闭包中为自定义JSON编组做的事情:
def init = {servletContext ->
grailsApplication.domainClasses.each {domainClass ->
domainClass.metaClass.part = {m ->
def map = [:]
if (m.'include') {
m.'include'.each {
map[it] = delegate."${it}"
}
} else if (m.'except') {
m.'except'.addAll excludedProps
def props = domainClass.persistentProperties.findAll {
!(it.name in m.'except')
}
props.each {
map['id'] = delegate.id
map[it.name] = delegate."${it.name}"
}
}
return map
}
}
JSON.registerObjectMarshaller(Date) {
return it?.format("dd.MM.yyyy")
}
JSON.registerObjectMarshaller(User) {
def returnArray = [:]
returnArray['username'] = it.username
returnArray['userRealName'] = it.userRealName
returnArray['email'] = it.email
return returnArray
}
JSON.registerObjectMarshaller(Role) {
def returnArray = [:]
returnArray['authority'] = it.authority
return returnArray
}
JSON.registerObjectMarshaller(Person) {
return it.part(except: ['fieldX', 'fieldY'])
}}
Run Code Online (Sandbox Code Playgroud)
你看到我有Date,Use,Person和Role Class的自定义marshallers
我发现这篇文章的同时试图找到一个适当的方法来进行编组注册.与Nils的答案相比,最大的不同是这个解决方案使BootStrap.groovy完好无损,这很好.
http://compiledammit.com/2012/08/16/custom-json-marshalling-in-grails-done-right/
| 归档时间: |
|
| 查看次数: |
9947 次 |
| 最近记录: |