Способ создания объекта JSON довольно неясен. То, что мне нравится делать для отображения ответов JSON в grails, - это создание карты или списка в groovy, а затем использование метода render
для преобразования его в JSON.
Выполнение преобразования rowResult
в методе рендеринга делает его довольно запутанным, я бы предпочел что-то вроде этого
def results = db.rows(query).collect { rowResult ->
b(rowResult.name, c, d)
}
render(contentType: 'text/json') {[
'results': results,
'status': results ? "OK" : "Nothing present"
]}
Я думаю, что это более читабельно и даже короче. Этот фрагмент дает желаемый результат: никаких объектов внутри массива results
, только строки.
Обратите внимание на использование rows
, которое возвращает список RowResult, избавляя от необходимости получать его из ResultSet. Список используется для сбора преобразованного значения a
путем вызова b
для имени каждой строки. Сбор элементов не подразумевает создание карты (как в полученном вами { "A":"value1"}
JSON), просто то же самое, что и @ will-buck, достигается с помощью оператора <<
в новом пустом списке.
Все, что мы делаем с методом render, - это объявление типа контента text/json
и передача ему литеральной карты, содержащей ключи results
и status
, которые вы хотите записать в ответ. Условный оператор используется для краткого определения статуса. Его также можно использовать, например, с помощью преобразователя JSON @ will-buck, который также упоминается:
def responseData = [
'results': results,
'status': results ? "OK" : "Nothing present"
]
render responseData as JSON