在 Groovy/Grails 中使用 JSON 创建对象

Posted

技术标签:

【中文标题】在 Groovy/Grails 中使用 JSON 创建对象【英文标题】:Using JSON to create an object in Groovy/Grails 【发布时间】: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);

【问题讨论】:

【参考方案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】:

这可能对你有用

http://static.springsource.org/spring-roo/reference/html/base-json.html

【讨论】:

以上是关于在 Groovy/Grails 中使用 JSON 创建对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 Groovy(Grails) 写入文件对于某些行(断行)失败

Groovy/grails 如何使用 jquery 从视图中调用控制器方法

使用 Quartz 调试 Groovy/Grails 应用程序中的堆空间问题

如何在 Groovy/Grails 上实现社交网络登录? [关闭]

在 GSP 中打印时在变量中评估 Groovy/Grails 代码

使 IntelliJ 突出显示 Groovy/Grails 语法错误