2012-05-23 2 views
4

Я хочу, чтобы каждый ответ JSON после запроса содержал поле success. Каков наилучший способ добавить это поле?Есть ли способ добавить дополнительное поле в ответ Grails JSON?

Я использую подобный код для генерации JSON ответы:

try { 
    def entity = myService.saveEntity(arg1,arg2) 
    render entity as JSON //I want to add artificial field 'success = "yes"' here 
} catch (ValidationException e) { 
    render parseErrors(e.errors) as JSON //field 'success = "no"' here 
} 

ответ

4

могли бы вы вернуть карту, содержащую success поле, и объект, обернутый в отдельную переменную:

try { 
    def entity = myService.saveEntity(arg1,arg2) 
    render [ success:'yes', val:entity ] as JSON 
} catch (ValidationException e) { 
    render [ success:'no', val:parseErrors(e.errors) ] as JSON 
} 

не тестировал mind ...

4

Вы можете зарегистрировать свой собственный маршаллер JSON (например, BootStrap.groovy), например:

JSON.registerObjectMarshaller(MyEntity) { MyEntity it -> 
    return [ 
    someField : it.someField, // you should specify fields for output, or put all '.properties' 
    success : true // as I understand you always have 'true' for real entity 
    ] 
} 

где MyEntity ваш класс, который вы хотите использовать

7

я просто боролся с этим точным вопросом на этой неделе. Я хотел отправить класс домена как JSON, но в то же время добавить свойство errorMessage, которое потенциально может содержать дополнительную информацию.

Оказывается, что при использовании в качестве JSON в Грааль он отправляет обратно объект конвертера, но его можно превратить этот конвертер экземпляр в JSONObject с помощью JSON.parse() который мы можем легко добавлять новые значения в.

def jsonObject = JSON.parse((entity AS JSON).toString()) 
jsonObject.put("success", "yes") 
render jsonObject as JSON 

Я думаю, что есть несколько различных подходов, но это закончилось тем, что было самым легким для меня, так как у меня уже есть собственные конвертеры для большинства моих классов предметной области, и я не хочу, чтобы добавить какие-либо другие преходящие свойства мой объект домена.

+1

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

Смежные вопросы