6

Ho un sito Web Groovy/Grails che viene utilizzato per inviare dati ai client Android tramite JSON. Ho creato sia il client Android che il sito Web Groovy/Grails; e possono produrre gli stessi oggetti in JSON.Utilizzo di JSON per creare un oggetto in Groovy/Grails

Posso creare correttamente i rispettivi oggetti in Android associando l'output JSON agli oggetti Java, tuttavia mi chiedevo se è possibile utilizzare l'output JSON per creare un nuovo oggetto dominio in Groovy/Grails? Esiste un modo per trasmettere l'output JSON a un'azione del controller in modo che l'oggetto venga creato?

Ecco un esempio del JSON che vorrei inviare;

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

La "classe" corrisponde al dominio che vorrei salvare, l'ID è l'ID del dominio, quindi ogni elemento all'interno dei businessCardDesigns e emailAddrs ha bisogno di essere salvato utilizzando metodi simili (in Dominio il businessCardDesigns e emailAddrs sono ArrayLists). Molte grazie in anticipo!

SOLUZIONE:

@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); 
} 

risposta

6

So che già accettato una risposta, ma se sto leggendo la tua domanda giusta, c'è una costruito nel Modo "Grails" per farlo.

Creare una voce per la propria azione in URLMappings.groovy e attivare l'analisi della richiesta. Per esempio, ho creare mappature RESTful in questo modo:

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

E poi in voi controller

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

Questo sembra che potrebbe rivelarsi molto utile; grazie per il contributo Ci proverò lunedì. :) – krslynx

12

utilizzando il convertitore Grails built-in JSON rende questo più facile rispetto alle altre risposte, a mio parere:

import grails.converters.JSON 

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

Gli altri vantaggi sono:

  • Non c'è bisogno di impazzire in tutti i file di configurazione
  • L'oggetto JSON risultante può essere manipolata, se necessario, prima di Assegnazione delle proprietà
  • E 'molto più chiaro nel codice quello che sta succedendo (stiamo analizzando un oggetto JSON e l'impostazione le proprietà sull'entità Persona)
+1

Percorso di importazione fisso: import grails.converters.JSON –

+1

Grazie per aver catturato quell'errore di battitura. – OverZealous

+0

@OverZealous - Esattamente quello che stavo cercando. Grazie. – mtyson

Problemi correlati