首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除少数属性外的grails.converters.JSON

除少数属性外的grails.converters.JSON
EN

Stack Overflow用户
提问于 2011-05-09 19:34:40
回答 5查看 8.5K关注 0票数 10

我使用的是grails-1.3.2和hbase-0.2.4。

我有以下域类:

代码语言:javascript
复制
class MyClass{
  String val1
  String val2
  String val3

   //----

 }

class MyClassController{
    def someAction = {
        def myClass = new MyClass()
        //----

        String valAsJson = (myClass as JSON)

        render valAsJson 
     }
}

我的问题是,是否有任何简单的方法只渲染部分属性(例如,渲染除val3属性之外的所有属性)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-09 20:44:15

如果您希望始终只包含特定的属性,那么您可能真的希望使用ObjectMarshaller接口。有关更多详细信息,请参阅this article

票数 3
EN

Stack Overflow用户

发布于 2011-05-09 20:07:18

你可以这样做:

代码语言:javascript
复制
def myClass = MyClass.get(1)

 //include
 render myClass.part(include:['val1', 'val2']) as JSON

 //except
 render job.part(except:['val2','val3']) as JSON

Bootstrap.groovy :

代码语言:javascript
复制
import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor as Events

class BootStrap {
 def grailsApplication

 def excludedProps = [Events.ONLOAD_EVENT,
    Events.BEFORE_DELETE_EVENT, Events.AFTER_DELETE_EVENT,
    Events.BEFORE_INSERT_EVENT, Events.AFTER_INSERT_EVENT,
    Events.BEFORE_UPDATE_EVENT, Events.AFTER_UPDATE_EVENT]

  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[it.name]= delegate."${it.name}"
                 }
             }
             return map
         }
     }
  }
  def destroy = {
  }
}

如果您知道如何创建我们自己的插件,那么只需为此创建一个插件,这样您就可以在所有grails应用程序中使用它。

票数 5
EN

Stack Overflow用户

发布于 2011-05-09 20:52:04

或者,您可以只创建所需属性的映射,然后将其编码为JSON

代码语言:javascript
复制
Map m = [ 'val1', 'val2' ].inject( [:] ) { map, val -> map."$val" = a."$val" ; map }
render m as JSON

要排除属性,您需要执行以下操作(未测试)

代码语言:javascript
复制
def exclude = [ 'val3' ]
Map m = new DefaultGrailsDomainClass( MyClass.class ).properties.findAll {
  !( it.name in exclude )
}.inject( [:] ) { map, val ->
  map."$val.name" = a."$val.name" ; map
}
render m as JSON
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5936300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档