grails.converters.JSON除了几个属性之外

grails.converters.JSON除了几个属性之外,json,grails,groovy,render,converter,Json,Grails,Groovy,Render,Converter,我正在使用grails-1.3.2和hbase-0.2.4 我有以下域类: class MyClass{ String val1 String val2 String val3 //---- } class MyClassController{ def someAction = { def myClass = new MyClass() //---- String valAsJson = (myClass as

我正在使用grails-1.3.2和hbase-0.2.4

我有以下域类:

class MyClass{
  String val1
  String val2
  String val3

   //----

 }

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

        String valAsJson = (myClass as JSON)

        render valAsJson 
     }
}

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

您可以执行以下操作:

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:

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应用程序中使用它。

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

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

Map m = [ 'val1', 'val2' ].inject( [:] ) { map, val -> map."$val" = a."$val" ; map }
render m as JSON
要排除属性,您需要执行以下操作(未测试)


如果您只想将
MyClass
的实例呈现为JSON,不包括某些属性,那么下面是一个使用Grails提供的
JSONBuilder
类的解决方案

import grails.web.JSONBuilder

class MyClassController{

    def someAction = {

        def myClass = new MyClass()

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

            // Properties excluded from the JSON
            def excludes = ['class', 'metaClass', 'val3']

            if (!excludes.contains(propName)) {

                setProperty(propName, propValue)
            }
        }
        render(text: builder.toString(), contentType: 'application/json')
     }
}

JSON排除Marshaller插件

我最近需要解决这个问题。我继续将解决方案打包到一个插件中,该插件允许您轻松地从JSON转换器的输出中排除类属性。它可以在Grails插件门户上获得

之后,您将可以访问grails.converters.JSON类上名为excludeFor*()的方法

更广泛的文档可在此处找到:

但基本上可以这样使用:

import grails.converters.JSON

def json, resultTeachersWillSee, resultOtherStudentsWillSee

// Given a TestStudent Domain Class
def student = new TestStudent([
    firstName: "Tobias",
    lastName: "Funke",
    gradePointAverage: 3.6,
    studentID: "FS-210-7312",
    socialSecurityNumber: "555-55-5555"
])
student.save(flush: true)

// When
JSON.excludeForTeachers(TestStudent, ['socialSecurityNumber', 'id', 'class'])

JSON.use('excludeForTeachers') {
    json = new JSON(student)
}
resultTeachersWillSee = json.toString()

// Then
assert resultTeachersWillSee == '{"firstName":"Tobias",
       "gradePointAverage":3.6, "lastName":"Funke", 
       "studentID":"FS-210-7312"}'



// And When
JSON.excludeForOtherStudents(TestStudent, ['gradePointAverage', 'studentID', 
     'socialSecurityNumber', 'id', 'class'])

JSON.use('excludeForOtherStudents') {
    json = new JSON(student)
}
resultOtherStudentsWillSee = json.toString()

// Then
assert resultOtherStudentsWillSee == '{"firstName":"Tobias",
       "lastName":"Funke"}'
excludeForTeachers(…)创建名为“excludeForTeachers”的命名对象封送器。marshaller从结果JSON输出中排除student对象的三个属性。“socialSecurityNumber”属性是在类中显式定义的,而“id”属性是由GORM在幕后添加的。在任何情况下,教师都不需要看到任何这些属性


插件很适合我。。。我希望其他人也会觉得它很有用。

谢谢你的回答…它不适用于hbase,我也找不到类似的hbase。你应该给出你从哪里获得代码的参考,我认为应该有效…但没有测试它…如果你试过,它有效,你能告诉我吗?Gregg它有效,但我想排除属性,因为我只有很少的域类,可能需要20个或更多的属性,我只想排除一个或两个。如果我没有找到其他解决方案,我会使用它。。。thanks@Gregg您认为在实施封送拆收器时会出现性能问题吗。我们已经在我们的两个项目中使用了它们,我们也经历过。还有其他方法吗?
import grails.converters.JSON

def json, resultTeachersWillSee, resultOtherStudentsWillSee

// Given a TestStudent Domain Class
def student = new TestStudent([
    firstName: "Tobias",
    lastName: "Funke",
    gradePointAverage: 3.6,
    studentID: "FS-210-7312",
    socialSecurityNumber: "555-55-5555"
])
student.save(flush: true)

// When
JSON.excludeForTeachers(TestStudent, ['socialSecurityNumber', 'id', 'class'])

JSON.use('excludeForTeachers') {
    json = new JSON(student)
}
resultTeachersWillSee = json.toString()

// Then
assert resultTeachersWillSee == '{"firstName":"Tobias",
       "gradePointAverage":3.6, "lastName":"Funke", 
       "studentID":"FS-210-7312"}'



// And When
JSON.excludeForOtherStudents(TestStudent, ['gradePointAverage', 'studentID', 
     'socialSecurityNumber', 'id', 'class'])

JSON.use('excludeForOtherStudents') {
    json = new JSON(student)
}
resultOtherStudentsWillSee = json.toString()

// Then
assert resultOtherStudentsWillSee == '{"firstName":"Tobias",
       "lastName":"Funke"}'