json - 如何使用Groovy将JSON数据元素解析为域对象

标签 json grails groovy

我们正在使用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属性名称
  • 匹配
  • 每个域属性都是一个String或一个带有String参数的setter。

  • 如果不是这种情况(因为您提供的示例中未包含),则情况要复杂一些。
    将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/

    相关文章:

    sql - 查询 athena 时将结构转换为 json

    grails - Grails IReport Jasper返回空白页

    groovy - 带有 Groovy 的 DSL -> 传递参数值

    java - Groovy 元类与 Java 8 的互操作性

    python - 使用 Python 对 JSON 进行排序

    Java 中的 JSON 补丁请求验证

    eclipse - 如何将Vaadin 7.3.9集成到Eclipse中的Grails项目中?

    ruby - Ruby 中有默认 block 参数吗?

    c# - WCF Web 服务客户端没有端点监听

    html - Grails: Assets 管道和 GSP 模板