Использование JSON для создания объекта в Groovy / Grails - PullRequest
6 голосов
/ 09 сентября 2011

У меня есть веб-сайт Groovy / Grails, который используется для отправки данных клиентам Android через JSON.Я создал как клиент Android, так и веб-сайт Groovy / Grails;и они могут выводить одни и те же объекты в формате JSON.

Я могу успешно создать соответствующие объекты в Android, сопоставив вывод JSON с объектами Java, однако мне было интересно, возможно ли использовать вывод JSON для создания нового объекта домена в Groovy / Grails?Есть ли способ передачи вывода JSON в действие контроллера, чтобы этот объект был создан?

Вот пример JSON, который я хотел бы отправить;

{
    "class":"org.icc.callrz.BusinessCard.BusinessCard",
    "id":1,
    "businessCardDesigns":[],
    "emailAddrs":[
    {
        "class":"org.icc.callrz.BusinessCard.EmailAddress",
        "id":1,
        "address":"chris@krslynx.com",
        "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":"cb@i-cc.cc",
        "businessCard":{
            "_ref":"../..",
            "class":"org.icc.callrz.BusinessCard.BusinessCard"
        },
        "index":1,
        "type":{
            "enumType":"org.icc.callrz.BusinessCard.EmailAddress$EmailAddressType",
            "name":"W"
        }
    }
    ]
}

«Класс» соответствует домену, в который я хочу сохранить, идентификатор - этоИдентификатор домена, затем каждый элемент в рамках businessCardDesigns и emailAddrs необходимо сохранить с использованием аналогичных методов (в домене businessCardDesigns и emailAddrs являются ArrayLists).Большое спасибо заранее!

РЕШЕНИЕ:

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

Ответы [ 3 ]

12 голосов
/ 11 сентября 2011

Использование встроенного JSON-конвертера Grails делает это проще, чем другие ответы, на мой взгляд:

import grails.converters.JSON

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

Другие преимущества:

  • Нет необходимости копаться в любых конфигурационных файлах
  • Полученным объектом JSON можно манипулировать, если необходимо, перед присвоением свойств
  • В коде гораздо понятнее, что происходит (мы анализируем объект JSON и устанавливаем свойства для объекта Person)
6 голосов
/ 10 сентября 2011

Я знаю, что вы уже приняли ответ, но если я правильно читаю ваш вопрос, для этого есть встроенный способ "Grails".

Создайте запись для вашего действия в URLMappings.groovy и включитепо запросу разбор.Например, я создаю сопоставления RESTful, например, так:

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

И затем в вашем контроллере

def save = {
   def businessCardInstance = new BusinessCard(params.businessCard)
   ....
   businessCardInstance.save(flush:true)
}
1 голос
/ 09 сентября 2011

это может сработать для вас

http://static.springsource.org/spring-roo/reference/html/base-json.html

...