持久化日期并与JSON嵌套

时间:2015-12-06 04:00:58

标签: grails

我试图保存嵌套的人,这是json数组并抱怨需要一个Set。

我遇到的另一个问题是,另一个字段日期不能为空,但已包含值。

在将params添加到我的对象之前我需要做什么或者我必须更改我的json?我试图像这样保存json帖子:

// relationship of Test
//static hasMany = [people: Person, samples: Sample]

def jsonParams= JSON.parse(request.JSON.toString())
def testInstance= new Test(jsonParams)

//Error requiring a Set
[Failed to convert property value of type 'org.codehaus.groovy.grails.web.json.JSONArray' to required type 'java.util.Set' for property 'people'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.Person] for property 'people[0]': no matching editors or conversion strategy found]]
//error saying its null
Field error in object 'com.Test' on field 'samples[2].dateTime': rejected value [null]; codes [com.Sample]

//...
"samples[0].dateTime_hour":"0",
"samples[0].dateTime_minute":"0",
"samples[0].dateTime_day":"1",
"samples[0].dateTime_month":"0",
"samples[0].dateTime_year":"-1899",
"samples[0]":{  
  "dateTime_minute":"0",
  "dateTime_day":"1",
  "dateTime_year":"-1899",
  "dateTime_hour":"0",
  "dateTime_month":"0"
},
"people":[  
  "1137",
  "1141"
], //...

1 个答案:

答案 0 :(得分:0)

首先,这条线是不必要的:

def jsonParams= JSON.parse(request.JSON.toString())

request.JSON可以直接传递给Test构造函数:

def testInstance = new Test(request.JSON)

<小时/> 我不确定你的Person课程是什么样的,但我假设这些数字(1137,1141)是ids。如果是这种情况,那么你的json应该可以工作 - 直接传递request.JSON可能会有所帮助。我在本地测试了您的JSON,并且没有关联hasMany集合的问题。我也用过:

// JSON numbers rather than strings
"people": [1137, 1141]

// using Person map with the id
"people: [{
    "id": 1137
}, {
    "id": 1141
}]

这两种方法都很有效,值得一试。

<小时/> 关于null dateTime,我会重写你的JSON。我会将dateTime发送到一个字段中,而不是将值拆分为小时/分钟/天/等。默认格式为yyyy-MM-dd HH:mm:ss.Syyyy-MM-dd'T'hh:mm:ss'Z',但这些格式可由grails.databinding.dateFormats配置设置(config.groovy)定义。还有其他方法可以进行绑定(@BindingFormat注释)但最简单的方法就是以grails无需额外配置即可处理的方式发送日期。

如果您将dateTime拆分成碎片,那么您可以使用@BindUsing注释:

class Sample{
    @BindUsing({obj, source ->   
        def hour = source['dateTime_hour']
        def minute = source['dateTime_minute']
        ...
        // set obj.dateTime based on these pieces
    })
    Date dateTime
}

<小时/> 对JSON进行额外评论,您似乎已将samples[0]定义了两次,并且正在为内部集合使用2种语法(JSON数组和索引键)。我个人会坚持用一种语法来清理它:

"samples": [  
  {"dateTime": "1988-01-01..."}
  {"dateTime": "2015-10-21..."}
],"people": [  
  {"id": "1137"},
  {"id": "1141"}
],