Предоставление JSON в grails - программирование
Подтвердить что ты не робот

Предоставление JSON в grails

Я использую следующий код для рендеринга данных в формате 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"
}
4b9b3361

Ответ 1

Способ создания объекта 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

Ответ 2

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

aMap.put("A", a)

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

def aList = []
aList << a

Вы получите то, что хотите!

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

Ответ 3

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

render results as grails.converters.JSON