Использование JSON для создания объекта в Groovy/Grails

У меня есть веб-сайт 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":"[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"
        }
    }
    ]
}

«Класс» соответствует домену, в который я хочу сохранить, идентификатор — это идентификатор домена, затем каждый элемент в 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);
}

person krslynx    schedule 09.09.2011    source источник


Ответы (3)


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

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

person allthenutsandbolts    schedule 09.09.2011

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

import grails.converters.JSON

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

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

  • Нет необходимости копаться в каких-либо файлах конфигурации
  • При необходимости можно манипулировать результирующим объектом JSON перед назначением свойств.
  • В коде гораздо понятнее, что происходит (мы анализируем объект JSON и устанавливаем свойства сущности Person)
person OverZealous    schedule 11.09.2011
comment
Фиксированный путь импорта: import grails.converters.JSON - person Tomáš; 16.08.2013
comment
Спасибо, что поймали эту опечатку. - person OverZealous; 16.08.2013
comment
@OverZealous - именно то, что я искал. Спасибо. - person mtyson; 10.01.2014

Я знаю, что вы уже приняли ответ, но если я правильно понимаю ваш вопрос, для этого есть встроенный способ "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)
}
person Gregg    schedule 09.09.2011
comment
Похоже, это может оказаться очень полезным; спасибо за вклад. В понедельник попробую. :) - person krslynx; 10.09.2011