将两个域对象值显示为一个JSON输出

将两个域对象值显示为一个JSON输出,json,grails,Json,Grails,我正在研究grails,我有一个用例,其中有两个域类class a和class B,它们是独立的类 class A String name, String age class B String report JSON.registerObjectMarshaller(A) {it-> def result =

我正在研究grails,我有一个用例,其中有两个域类class a和class B,它们是独立的类

class A                                                
String name,                                          
String age

class B
String report
JSON.registerObjectMarshaller(A) {it->
def result = [:]
result['name'] = it.name
result['age'] = it.age
result['report'] = it.report    //It throws an error no such property: report for class A.How to write it in a proper JSON format to retrieve the report value?

return result
}
在Bootstrap.groovy文件中,我编写了以下格式以在JSON视图中显示值

class A                                                
String name,                                          
String age

class B
String report
JSON.registerObjectMarshaller(A) {it->
def result = [:]
result['name'] = it.name
result['age'] = it.age
result['report'] = it.report    //It throws an error no such property: report for class A.How to write it in a proper JSON format to retrieve the report value?

return result
}

Groovy提供了对Groovy之间转换的集成支持 对象和JSON。专门用于JSON序列化和 可以在groovy.json包中找到解析

例如,您可以使用

在你的例子中,你可以试试这个

有A类和B类的

class A {
    String name
    String age
}

class B {
    String report
}
在Bootstrap.groovy文件中导入
JsonBuilder

import groovy.json.JsonBuilder
A那么你可以试试

A a = new A(name: 'ana', age: '15')
B b = new B(report: 'lorem ipsum...')

JsonBuilder jsonBuilder = new JsonBuilder()

jsonBuilder.result {
    name a.name
    age a.age
    report b.report
}

println jsonBuilder.toString()
输出

{"result":{"name":"ana","age":"15","report":"lorem ipsum..."}}

如果您想要一个更可重用的代码,那么您可以创建一个具有公共属性的新类,以显示在json结果中

class MyJSONResult(){
   String name
   String age
   String report
   // add more properties as needed

   // constructor
   MyJSONResult(A a, B b){
      name = a.name
      age = a.name
      report = b.report
   }
}

//when you need json result,
import grails.converters.JSON


def json = new MyJSONResult(a, b)
render json as JSON
创建新类和对象的好处在于可以重用它。例如,如果需要在gsp页面中显示相同的结果,可以将对象传递给视图并访问其属性

def json = new MyJSONResult(a, b)
render view:'myview', model:[myVar: json]

// in gsp views
${myVar.name}

这样,您在构建json有效负载时使用的任何业务逻辑都可以用于您的api或其他任何您可能需要使用它们的地方

如果我不想创建新类,还有其他解决方案吗?