Как я могу зарегистрировать пользовательский десериализатор / анализатор json в Grails?

#grails #grails-2.0 #grails-controller

#grails #grails-2.0 #grails-контроллер

Вопрос:

Должен ли я использовать фильтры или перехватчики для удовлетворения требований, нет ли более простого способа?

Обновить:
Похоже, что мой старый код работал просто отлично, я непреднамеренно отредактировал resources.groovy и сделал недействительным определение компонента

 resources.groovy
================

beans = {
    dateConverter DateConverter
}

BootStrap.groovy
================

class BootStrap {
    def grailsApplication

    def init = { servletContext ->
       def ctx = grailsApplication.mainContext
       def dataBinder = ctx.getBean(org.grails.databinding.SimpleDataBinder)
       dataBinder.conversionHelpers[Date] = [ctx.getBean('dateConverter')]
    }
 }
 

Ответ №1:

Если вы хотите изменить его глобально, вы можете сделать что-то вроде этого:

     class Foo {
        String name
    }
 

и в Bootstrap.groovy (или в любом другом месте, которое вы предпочитаете):

     JSON.registerObjectMarshaller(Foo) {
        [name:it.name()]
    }
 

Если вам это нужно только в особых случаях, проще всего (по моему опыту) создать карту и преобразовать ее в JSON

 [name:'foo'] as JSON
 

Обновить

@BindUsing работает и для объектов command..

 class FooController {
    def foo (FooCmd bind) {
       render (text: "${bind.foo}")
    }
}

class FooCmd {
    @BindUsing({ obj, src ->
        "@BindUsing ${src['foo']}"
    })
    String foo
}

curl -i -H "Content-Type: application/json" -d '{"foo":"FOO!!!!"}' http://localhost:8080/Stackoverflow/Foo/foo
 

Комментарии:

1. Спасибо! Но то, что я ищу, — это способ отменить / отменить / десериализовать ввод json, а не наоборот.

2. Ибп, извини, очевидно, я все неправильно понял. 😉 Знаете ли вы об @BindUsing этом?

3. Да, и использовал его безрезультатно, это для привязок форм html.

4. Вы можете сделать это: class FooController { def foo (FooCmd bind) { render (текст: «${bind.foo}») } } class FooCmd { @BindUsing({ obj, src -> «@BindUsing $ {src[‘foo’]}» }) Строка foo } curl -i -H «Content-Type: application/json» -d ‘{«foo»:»FOO !!!!»}’ localhost:8080/Stackoverflow/Foo/foo

5. Ах, перепутал предыдущий комментарий и больше не могу его редактировать. Я добавил пример десериализации с @BindUsing размещением на объекте command. Он действительно связывает json из тела сообщения.