Рендеринг JSON в граалях - PullRequest
17 голосов
/ 09 марта 2012

Я использую следующий код для отображения данных в формате JSON.

render(contentType:"text/json") {
    results = array {
        db.eachRow(query) { row ->
            def rs = row.toRowResult()
            def a = b(rs.name,c,d)
            aMap.put("A",a) 
            pair(aMap)
        }
    }
    if (results) {
        status = "OK"
    }
    else {
        status ="Nothing present"
    }
}

Приведенный выше код генерирует JSON в следующем формате

{
    "results": [
        {"A":"value1"},
        {"A":"value2"},
        ...................
        {"A":"valuen"}
    ],
    "status":"OK"
}

Как вы видите выше, данныеотображается как массив объектов .Есть ли способ, которым я могу представить данные результатов в виде массива элементов .Как

{
    "results": [
        "value1",
        "value2",
        ...................
        "valuen"
    ],
   "status":"OK"
}

Ответы [ 3 ]

36 голосов
/ 10 марта 2012

Способ создания объекта 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
5 голосов
/ 10 марта 2012

Только по чуть-чуть :) Просто нужно поменять

aMap.put("A", a)

быть коллекцией или списком, а не картой. так что-то вроде

def aList = []
aList << a

Получу то, что ты хочешь!

Как примечание, в Grails есть JSON-конвертер, который выполнит эту работу для вас. Посмотрите на это здесь

0 голосов
/ 12 января 2019

Этого должно быть достаточно для рендеринга JSON из контроллера:

render results as grails.converters.JSON
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...