将两个域对象值显示为一个JSON输出
我正在研究grails,我有一个用例,其中有两个域类class a和class B,它们是独立的类将两个域对象值显示为一个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 =
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或其他任何您可能需要使用它们的地方如果我不想创建新类,还有其他解决方案吗?