【问题标题】:How to parse json data elements into domain object using groovy如何使用 groovy 将 json 数据元素解析为域对象
【发布时间】:2020-07-27 18:41:54
【问题描述】:

我们使用的是 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
}

【问题讨论】:

    标签: json grails groovy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 2021-12-04
      • 2017-12-11
      • 2019-12-18
      • 2011-10-05
      相关资源
      最近更新 更多