Grails - grails.converters.JSON - 删除类名

Posted

技术标签:

【中文标题】Grails - grails.converters.JSON - 删除类名【英文标题】:Grails - grails.converters.JSON - removing the class name 【发布时间】:2011-09-23 15:35:36 【问题描述】:

有没有办法删除 JSON 转换器中的类字段?

例子:

import testproject.*
import grails.converters.*  
emp = new Employee()  
emp.lastName = "Bar"  
emp as JSON  

作为一个字符串是

"class":"testproject.Employee","id":null,"lastName":"Bar"

我更喜欢

"id":null,"lastName":"Bar"

有没有办法在最后再添加一行代码来删除类字段?

【问题讨论】:

查看其他答案***.com/questions/5538423/grails-jsonbuilder/… 【参考方案1】:

这里还有一种方法可以做到这一点。 我在域类中添加了下一个代码:

static 
    grails.converters.JSON.registerObjectMarshaller(Employee) 
    return it.properties.findAll k,v -> k != 'class'
    

但正如我发现的那样,当您还必须将“类”添加到排除参数时,如果您使用了 Groovy @ToString 类注释,例如:

@ToString(includeNames = true, includeFields = true, excludes = "metaClass,class")

【讨论】:

【参考方案2】:

我的首选方式:

def getAllBooks() 
    def result = Book.getAllBooks().collect 
        [
            title: it.title,
            author: it.author.firstname + " " + it.author.lastname,
            pages: it.pageCount,
        ]
    
    render(contentType: 'text/json', text: result as JSON)

这将返回 Book.getAllBoks() 中的所有对象,但 collect 方法会将 ALL 更改为您指定的格式。

【讨论】:

【参考方案3】:

另一种选择是不使用构建器:

def myAction = 
    def emp = new Employee()
    emp.lastName = 'Bar'

    render(contentType: 'text/json') 
        id = emp.id
        lastName = emp.lastName
    

这有点不太正交,因为如果 Employee 发生变化,您需要更改渲染;另一方面,您可以更好地控制渲染的内容。

【讨论】:

【参考方案4】:
import testproject.*
import grails.converters.*  
import grails.web.JSONBuilder

def emp = new Employee()  
emp.lastName = "Bar"  

def excludedProperties = ['class', 'metaClass']

def builder = new JSONBuilder.build 
  emp.properties.each propName, propValue ->

  if (!(propName in excludedProperties)) 
    setProperty(propName, propValue)
  


render(contentType: 'text/json', text: builder.toString())

【讨论】:

【参考方案5】:

@wwarlock 的回答说对了,我得把 registerObjectMarshaller 放到 Bootstrap 上,才行。

【讨论】:

【参考方案6】:
def a = Employee.list()

String[] excludedProperties=['class', 'metaClass']
render(contentType: "text/json") 
    employees = array 
        a.each 
            employee it.properties.findAll  k,v -> !(k in excludedProperties) 
        
    

这对我有用。您可以轻松地传入任何要排除的属性。或者转身:

def a = Employee.list()

String[] includedProperties=['id', 'lastName']
render(contentType: "text/json") 
    employees = array 
        a.each 
            employee it.properties.findAll  k,v -> (k in includedProperties) 
        
    

注意:这仅适用于简单对象。如果您看到“错误放置的密钥:KEY 的预期模式但为 OBJECT”,则此解决方案不适合您。 :)

生命值

【讨论】:

【参考方案7】:

您可以使用 grails.converters.JSON 中提供的 setExcludes 方法自定义要排除的字段(包括类名)

def converter = emp  as JSON
converter.setExcludes(Employee.class, ["class",""])

然后,你就可以按照自己的要求来使用了,

println converter.toString()
converter.render(new java.io.FileWriter("/path/to/my/file.xml"))
converter.render(response)

【讨论】:

以上是关于Grails - grails.converters.JSON - 删除类名的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 grails 命令行编译 grails 项目?

是否可以在 Grails 之外使用 Grails 验证?如何?

Grails:企业级 Grails [关闭]

Grails - grails.converters.JSON - 删除类名

Grails - 在刷新 grails 错误之前保存瞬态实例?

Grails 3 - 资源插件