6

Mam witrynę Groovy/Grails, która jest używana do wysyłania danych do klientów Androida za pośrednictwem JSON. Stworzyłem zarówno klienta Android, jak i stronę Groovy/Grails; i mogą wyprowadzać te same obiekty w JSON.Używanie JSON do tworzenia obiektu w Groovy/Grails

Mogę pomyślnie tworzyć odpowiednie obiekty w systemie Android, mapując wyjście JSON na obiekty Java, ale zastanawiałem się, czy możliwe jest użycie wyjścia JSON do utworzenia nowego obiektu domeny w Groovy/Grails? Czy istnieje sposób przekazywania wyniku JSON do akcji kontrolera, aby obiekt został utworzony?

Oto przykład JSON, który chciałbym wysłać;

{ 
    "class":"org.icc.callrz.BusinessCard.BusinessCard", 
    "id":1, 
    "businessCardDesigns":[], 
    "emailAddrs":[ 
    { 
     "class":"org.icc.callrz.BusinessCard.EmailAddress", 
     "id":1, 
     "address":"[email protected]", 
     "businessCard":{ 
      "_ref":"../..", 
      "class":"org.icc.callrz.BusinessCard.BusinessCard" 
     }, 
     "index":0, 
     "type":{ 
      "enumType":"org.icc.callrz.BusinessCard.EmailAddress$EmailAddressType", 
      "name":"H" 
     } 
    }, 
    { 
     "class":"org.icc.callrz.BusinessCard.EmailAddress", 
     "id":2, 
     "address":"[email protected]", 
     "businessCard":{ 
      "_ref":"../..", 
      "class":"org.icc.callrz.BusinessCard.BusinessCard" 
     }, 
     "index":1, 
     "type":{ 
      "enumType":"org.icc.callrz.BusinessCard.EmailAddress$EmailAddressType", 
      "name":"W" 
     } 
    } 
    ] 
} 

„klasy” pasuje do domeny Chciałbym zapisać identyfikator jest identyfikatorem domeny, a następnie każdy element ciągu businessCardDesigns i emailAddrs musi być zapisany przy użyciu podobnych metod (w Domena businessCardDesigns i emailAddrs to ArrayLists). Z góry bardzo dziękuję!

ROZWIĄZANIE:

@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json") 
public ResponseEntity<String> createFromJson(@RequestBody String json) { 
    Owner.fromJsonToOwner(json).persist(); 
    return new ResponseEntity<String>(HttpStatus.CREATED); 
} 

Odpowiedz

6

wiem już zaakceptowane odpowiedzi, ale jeśli czytam swoje pytanie rację, nie ma wbudowany "Grails" sposób to zrobić.

Tworzenie pozycji dla swojego działania w URLMappings.groovy i włączyć żądanie parsowania. Na przykład utworzyć relaksującego mapowania tak:

"/api/bizCard/save"(controller: "businessCard", parseRequest: true) { 
    action = [POST: "save"] 
} 

I wtedy w was kontrolera

def save = { 
    def businessCardInstance = new BusinessCard(params.businessCard) 
    .... 
    businessCardInstance.save(flush:true) 
} 
+0

Wygląda na to, że może się okazać bardzo przydatny; dziękuję za wkład. Wypróbuję to w poniedziałek. :) – krslynx

12

Korzystanie konwerter wbudowane w Grails JSON sprawia, że ​​to łatwiejsze niż innych odpowiedzi, moim zdaniem:

import grails.converters.JSON 

class PersonController { 
    def save = { 
     def person = new Person(JSON.parse(params.person)) 
     person.save(flush:true) 
    } 
} 

Inne korzyści to:

  • Nie ma potrzeby, aby syf wokół w dowolnych plików konfiguracyjnych
  • Powstały obiekt JSON można manipulować, jeśli to konieczne, przed właściwości przypisywanych
  • to znacznie wyraźniej w kodzie, co się dzieje (jesteśmy analizowania obiekt JSON i ustawienie właściwości w podmiocie Osoba)
+1

Naprawiono ścieżkę importu: import grails.converters.JSON –

+1

Dzięki za złapanie tej literówki. – OverZealous

+0

@OverZealous - Dokładnie to, czego szukałem. Dzięki. – mtyson

Powiązane problemy