使用 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```