2013-10-02 4 views
24

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

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"} 
      ] 
}] 

Любая помощь с благодарностью. Спасибо заранее.

ответ

48

Проблема заключается в использовании конвертера 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 для установки глобального глубокого конвертера, но имейте в виду, что этот эффект вызывает все классы домена в вашем приложении. Это означает, что если у вас есть большое дерево ассоциаций, кульминацией которого является объект верхнего уровня, и вы пытаетесь преобразовать список тех объектов верхнего уровня, глубокий конвертер выполнит все запросы для извлечения всех связанных объектов и связанных с ними объектов в очередь. - Вы можете загрузить полную базу данных за один выстрел :) Будьте осторожны.

+0

Эй Спасибо, я использовал третий метод JSON.use («ОЭАП») {оказывают Родитель как JSON} он просто работал, как я ожидал. – user2823355

+0

большое вам спасибо! это решит многие проблемы <3 – Mephiztopheles

+0

Вы очень желанны, счастливы кодирование. – dbrin

1

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

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

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

3

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

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

статические отображения = {Чайлдс ленивых: ложные}

Смежные вопросы