Подтвердить что ты не робот

Грайлы получают объекты дочернего домена

У меня есть два класса домена, один из которых является родителем, а другой - дочерним, и у меня есть hasMany отношения между ними. Класс родителя имеет много дочерних, а дочерний класс принадлежит родительскому классу. И вот пример кодирования.

class Parent{
   String name
    static hasMany = [childs:Child] 
    static constraints = {
   }
}


class Child{
   String name
   static belongsTo = [parent:Parent]
   static constraints={}
}

Проблема заключается в том, что как только я получу родительский объект, дочерние объекты, связанные с родительским классом, также были извлечены. Но когда я конвертирую объект в JSON, я не вижу дочерний объект полностью, я могу видеть только ID дочерних объектов. Я хочу видеть все столбцы дочернего объекта, а не только Id.

Преобразованный ответ JSON:

[{"class":"project.Parent","id":1,
  "name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}]

Но мне нужен ответ, который также содержит имя дочернего объекта, как показано ниже.

[{"class":"project.Parent","id":1,"name":"name1",
  "childs":[{"class":"Child","id":1,"name":"childname1"},
            {"class":"Review","id":2,"name":"childname2"}
           ]
}]

Любая помощь очень ценится. Спасибо заранее.

4b9b3361

Ответ 1

Проблема заключается в использовании конвертера JSON по умолчанию. Вот ваши варианты:

 1. Default  -  all fields, shallow associations
    a. render blah as JSON

 2. Global deep converter - change all JSON converters to use deep association traversal
    a. grails.converters.json.default.deep = true

 3. Named config marshaller using provided or custom converters
    a. JSON.createNamedConfig('deep'){
        it.registerObjectMarshaller( new DeepDomainClassMarshaller(...) )
    }
    b. JSON.use('deep'){
        render blah as JSON
    }

 4. Custom Class specific closure marshaller 
    a. JSON.registerObjectMarshaller(MyClass){ return map of properties}
    b. render myClassInstance as JSON

 5. Custom controller based closure to generate a map of properties
    a. convert(object){
        return map of properties
    }
    b. render convert(blah) as JSON

В настоящее время вы используете вариант 1, который по умолчанию.

Самое простое, что вы можете сделать, это использовать вариант 2 для установки глобального глубокого конвертера, но имейте в виду, что это влияет на все классы домена в вашем приложении. Это означает, что если у вас есть большое дерево ассоциаций, кульминацией которого является объект верхнего уровня, и вы пытаетесь преобразовать список тех объектов верхнего уровня, глубокий конвертер выполнит все запросы для извлечения всех связанных объектов и связанных с ними объектов в очередь. - Вы можете загрузить всю базу данных за один снимок. Будьте осторожны.

Ответ 2

Последние грабли автоматически преобразуются, но вы, вероятно, жертва ленивой загрузки.

Дети не загружаются при доступе и, следовательно, конвертер JSON не может преобразовать их в JSON. Обходной путь заключается в том, чтобы положить это

статическое отображение = {childs lazy: false}

Ответ 3

Пользователь dbrin прав, но есть еще один вариант. Вы также можете использовать плагин Grails GSON:

https://github.com/robfletcher/grails-gson#readme

Плагин добавляет еще несколько функций при работе с json-данными.