gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:40:39 25 4
gpt4 key购买 nike

我们正在使用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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com