【问题标题】:Using JSON to create an object in Groovy/Grails在 Groovy/Grails 中使用 JSON 创建对象
【发布时间】:2011-11-13 22:14:36
【问题描述】:

我有一个 Groovy/Grails 网站,用于通过 JSON 向 Android 客户端发送数据。我已经创建了 Android 客户端和 Groovy/Grails 网站;他们可以在 JSON 中输出相同的对象。

我可以通过将 JSON 输出映射到 Java 对象来成功地在 Android 中创建相应的对象,但是我想知道是否可以使用 JSON 输出在 Groovy/Grails 中创建新的域对象?有没有办法将 JSON 输出传递给控制器​​操作,以便创建对象?

这是我要发送的 JSON 示例;

{
    "class":"org.icc.callrz.BusinessCard.BusinessCard",
    "id":1,
    "businessCardDesigns":[],
    "emailAddrs":[
    {
        "class":"org.icc.callrz.BusinessCard.EmailAddress",
        "id":1,
        "address":"chris@krslynx.com",
        "businessCard":{
            "_ref":"../..",
            "class":"org.icc.callrz.BusinessCard.BusinessCard"
        },
        "index":0,
        "type":{
            "enumType":"org.icc.callrz.BusinessCard.EmailAddress$EmailAddressType",
            "name":"H"
        }
    },
    {
        "class":"org.icc.callrz.BusinessCard.EmailAddress",
        "id":2,
        "address":"cb@i-cc.cc",
        "businessCard":{
            "_ref":"../..",
            "class":"org.icc.callrz.BusinessCard.BusinessCard"
        },
        "index":1,
        "type":{
            "enumType":"org.icc.callrz.BusinessCard.EmailAddress$EmailAddressType",
            "name":"W"
        }
    }
    ]
}

“类”与我要保存到的域匹配,ID 是域的 ID,然后需要使用类似的方法保存 businessCardDesigns 和 emailAddrs 中的每个项目(在域中 businessCardDesigns 和emailAddrs 是 ArrayLists)。非常感谢!

解决方案:

@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json")
public ResponseEntity<String> createFromJson(@RequestBody String json) {
    Owner.fromJsonToOwner(json).persist();
    return new ResponseEntity<String>(HttpStatus.CREATED);
}

【问题讨论】:

    标签: android grails groovy grails-domain-class grails-controller


    【解决方案1】:

    在我看来,使用内置的 Grails JSON 转换器比其他答案更容易:

    import grails.converters.JSON
    
    class PersonController {
        def save = {
            def person = new Person(JSON.parse(params.person))
            person.save(flush:true)
        }
    }
    

    其他好处是:

    • 无需在任何配置文件中乱七八糟
    • 如有必要,可以在分配属性之前操作生成的 JSON 对象
    • 在代码中发生的事情要清楚得多(我们正在解析 JSON 对象并在 Person 实体上设置属性)

    【讨论】:

    • 固定导入路径:import grails.converters.JSON
    • 感谢您发现这个错字。
    • @OverZealous - 正是我想要的。谢谢。
    【解决方案2】:

    我知道你已经接受了一个答案,但如果我没看错你的问题,那么有一个内置的“Grails”方法可以做到这一点。

    在 URLMappings.groovy 中为您的操作创建一个条目并打开请求解析。例如,我像这样创建 RESTful 映射:

    "/api/bizCard/save"(controller: "businessCard", parseRequest: true) {
       action = [POST: "save"]
    }
    

    然后在你的控制器中

    def save = {
       def businessCardInstance = new BusinessCard(params.businessCard)
       ....
       businessCardInstance.save(flush:true)
    }
    

    【讨论】:

    • 这看起来很有用;谢谢你的贡献。我会在星期一试一试。 :)
    【解决方案3】:
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 2012-10-07
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多