如何将JSON保存到具有嵌套成员的Grails域对象中

时间:2012-08-08 19:44:48

标签: json grails

鉴于这些域类:

class Person {
    Long id
    String name

    static hasMany = [aliases: PersonAlias]
}

class PersonAlias {
    Person person
    Long id
    String name
}

我尝试通过JSON土地进行直接往返加载/保存:

Person p = Person.get(20005353);
def json = p as JSON
def str = json as String
def map = JSON.parse(str)
p.properties = map
p.save(flush:true)

生成此JSON

{
  "id": 20005353,
  "name": "John Smith",
  "class": "Person",
  "aliases":
  [
    {
      "class": "PersonAlias",
      "id": 99,
      "name": "J. Smith"
    }
  ]
}

失败并出现此错误:

  

grails.validation.ValidationErrors:1个错误对象中的字段错误   字段'别名'上的'heavymeta.Person':拒绝值[[]];代码   [typeMismatch.heavymeta.Person.aliases,typeMismatch.aliases,typeMismatch.java.util.Set,typeMismatch];   参数   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[heavymeta.Person.aliases,aliases];参数[];默认   消息[别名]];默认消息[无法转换属性值   类型为'org.codehaus.groovy.grails.web.json.JSONArray'为必填项   为属性'aliases'键入'java.util.Set';嵌套异常是   java.lang.IllegalStateException:无法转换类型的值   [java.util.LinkedHashMap]到必需的类型[heavymeta.PersonAlias]   property'alias [0]':没有匹配的编辑器或转换策略   发现]

为什么会失败,有没有办法让它发挥作用?

1 个答案:

答案 0 :(得分:1)

我可以给你一些建议(=。在params动作中以调试模式检查update(如果你没有为控制台generate-all Person中的域类生成视图和控制器看看params.aliases你会发现它是ids列表。尝试相同。