我们正在使用Grails 3.2版。我有json响应和Domain对象,如下所示。我们如何使用groovy将json响应解析为域对象以保存在数据库中,而无需将所有json响应元素手动转换为我的域属性。
json response
{
"orderId": 1,
"orderDateTime": "07/10/2020",
"orderTypeId": 1,
"userId": "12345",
"StateId": "5"
}
Domain object:
class Order {
Long id
Date orderDate
Long orderType
Long user
Long state
}
最佳答案
使用JsonSlurper
JsonSlurper类可以为您完成此操作。
简单的例子
最简单的方法是这样的:
json = new JsonSlurper().parseText( jsonStrIn )
order = new Order( json )
但这仅在以下情况下有效:如果不是这种情况(因为您提供的示例中未包含),则情况要复杂一些。
将JSON属性映射到域属性
要解决名称差异,您可以创建JSON名称到域名的映射,并在解析JSON字符串之前使用该映射修改JSON字符串。
Map propertyNameMap = [
'orderId': 'id',
'orderDateTime': 'orderDate',
'orderTypeId': 'orderType',
'userId': 'user',
'StateId': 'state'
]
propertyNameMap.each { jsonName, domainName ->
jsonStrIn = jsonStrIn.replaceAll( jsonName, domainName )
}
如果JSON属性名称可以出现在值字符串中,则可能需要使用正则表达式。工作的例子
以下代码将从JSON中填充您的域,将其正确地从String转换为long(在需要时),并允许属性名称有所不同。
import groovy.json.JsonSlurper
import java.text.SimpleDateFormat
String jsonStrIn = '''{
"orderId": 1,
"orderDateTime": "07/10/2020",
"orderTypeId": 1,
"userId": "12345",
"StateId": "5"
}'''
@groovy.transform.ToString
class Order {
Long id
Date orderDate
Long orderType
Long user
Long state
void setOrderDate( String dt ) {
orderDate = new SimpleDateFormat('dd/MM/yyyy').parse( dt )
}
void setUser( String uid ) {
user = Long.parseLong( uid )
}
}
Map propertyNameMap = [
'orderId': 'id',
'orderDateTime': 'orderDate',
'orderTypeId': 'orderType',
'userId': 'user',
'StateId': 'state'
]
propertyNameMap.each { jsonName, domainName ->
jsonStrIn = jsonStrIn.replaceAll( jsonName, domainName )
}
println jsonStrIn
json = new JsonSlurper().parseText( jsonStrIn )
order = new Order( json )
println order
代码输出运行上面的示例将显示转换后的JSON和从中创建的Order实例。
{
"id": 1,
"orderDate": "07/10/2020",
"orderType": 1,
"user": "12345",
"state": "5"
}
Order(1, Wed Oct 07 00:00:00 BST 2020, 1, 12345, 53)
[Done] exited with code=0 in 1.677 seconds```
关于json - 如何使用Groovy将JSON数据元素解析为域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63121573/