2013-10-02 12 views
24

Ich habe zwei Domain-Klassen eine Elternteil ist und andere ist Kind, und ich habe eine hasMany Beziehung zwischen ihnen. Die Elternklasse hat viele Kinder und die Kindklasse gehört zur Elternklasse. Und hier ist Codierungsbeispiel.Grails bekommen Kind Domain-Objekte

Problem ist, sobald ich das übergeordnete Objekt die Child-Objekte erhalten, die Elternklasse zugeordnet sind, wurden auch abgerufen. Aber wenn ich das Objekt in JSON konvertiere, sehe ich das Kindobjekt nicht vollständig. Ich kann nur die IDs der Kindobjekte sehen. Ich möchte alle Spalten des untergeordneten Objekts statt nur der ID sehen.

Converted JSON Antwort:

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

Aber ich will die Antwort, die auch Name des Kindes Objekt enthält, wie folgt

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

jede Hilfe sehr dankbar. Vielen Dank im Voraus.

Antwort

48

Das Problem ist mit der Verwendung von Standard-JSON-Konverter. Hier sind Ihre Optionen:

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 

Sie verwenden derzeit Option 1, die standardmäßig festgelegt ist.

Am einfachsten können Sie Option 2 verwenden, um den globalen Deep-Converter festzulegen. Beachten Sie jedoch, dass dies ALLE Domänenklassen in Ihrer App betrifft. Wenn Sie also einen großen Baum von Assoziationen haben, der in einem Top-Level-Objekt kulminiert, und Sie versuchen, eine Liste dieser Top-Level-Objekte zu konvertieren, führt der Deep Converter alle Abfragen aus, um alle zugehörigen Objekte und die zugehörigen Objekte abzurufen Wende. - Sie könnten eine ganze Datenbank in einem Schuss laden :) Seien Sie vorsichtig.

+0

Hey Dank I 3. Methode JSON.use verwendet ('deap') {machen Parent als JSON} es funktionierte so, wie ich erwartet hatte. – user2823355

+0

vielen dank! dies löst viele Probleme <3 – Mephiztopheles

+0

Sie sind herzlich willkommen, fröhliche Codierung. – dbrin

3

Die neuesten Grails automatisch tief konvertiert, aber Sie sind wahrscheinlich ein Opfer der faulen Laden.

Die untergeordneten Elemente werden beim Zugriff nicht geladen und daher kann der JSON-Konverter sie nicht in JSON konvertieren. Die Abhilfe dieses

statische Zuordnung = {Childs faul: false} zu setzen ist