Рендеринг Grails 3 JSON не может отображать список?

У меня возникла проблема при отображении списка результатов. Grails не может отображать список? вот мой код

def findSome(){
    String query = params?.some
    List<Some> someList = Some.createCriteria().list(max : 5) {
        if(query != null && query != ""){
            and {
                like("name", query)
            }
        }

        order("name", "asc")
    }
    someList = someList == null ? new ArrayList<Some>() : someList

    ->> render someList as JSON
}

что-то не так с моим кодом? что я помню, так это то, что Grails МОЖЕТ отображать список объектов. но с этим кодом всегда возвращайте null в строке с отметкой ->>.


person dadang1234    schedule 07.10.2017    source источник
comment
Каков результат println someList перед рендерингом?   -  person Prakash Thete    schedule 09.10.2017


Ответы (4)


Поскольку результатом запроса критериев является список объектов, следует использовать render someList как JSONArray. Для отображения в формате JSON ваш список должен иметь соответствующую пару значений ключа. Вам лучше преобразовать someList в карту пар ключ-значение и визуализировать как JSON, если вам действительно нужен объект JSON.

   def findSome(){
String query = params?.some
List<Some> someList = Some.createCriteria().list(max : 5) {
    if(query != null && query != ""){
        and {
            like("name", query)
        }
    }

    order("name", "asc")
}
someList = someList == null ? new ArrayList<Some>() : someList

render someList as JSONArray

}

если вы хотите отображать как JSON, используйте следующий код:

  def findSome(){
def someMap=[:]
String query = params?.some
List<Some> someList = Some.createCriteria().list(max : 5) {
    if(query != null && query != ""){
        and {
            like("name", query)
        }
    }

    order("name", "asc")
}
someList = someList == null ? new ArrayList<Some>() : someList
 someList.each{
   someMap.put(it.id,it) 
 }
 render someMap as JSON

}

person BenHuman    schedule 27.10.2017
comment
Не могли бы вы дать мне ссылку на документацию в формате JSON - person Thamer; 15.04.2020

Вы должны переместить тест для запроса за пределы критериев. Нет смысла создавать его, если запрос ничего не значит. Вам также не нужно, и в вашем запросе критериев вы можете просто использовать eq ("имя", запрос)

В вашем случае подобное и экв одинаковы.

person grahamhumphries    schedule 07.10.2017
comment
Я пробовал с тем, что вы сказали. с findAll(), и я вижу, что объект не равен нулю. но этот контроллер всегда возвращает нулевое исключение с [ в представлении ошибок. Я понятия не имею, что происходит с этими конвертерами JSON: | - person dadang1234; 08.10.2017

Да, Grails может отображать список объектов. Что касается вашего запроса, вы можете упростить его до чего-то вроде этого.

def findSome() {
    respond Some.createCriteria().list {
        like 'name', "%$query%"

        maxResults 5
        order 'name', 'asc'
    }
}

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

В разделе Ответ в формате JSON вы можете найти другие способы ответа на json

person Mario    schedule 07.10.2017
comment
Я думаю, что ошибка не в запросе. Я пробовал использовать findAll(), и он возвращает ту же ошибку: | - person dadang1234; 08.10.2017
comment
Какую версию Grails вы используете? - person Mario; 08.10.2017
comment
Версия Grails: 3.2.8 - person dadang1234; 08.10.2017
comment
вам не нужно зависеть от render someList as JSON, вы можете попробовать render(contentType: 'application/json') { someList } или respond someList, вы можете прочитать об ответах с помощью JSON по этой ссылке docs.grails.org/latest/guide/single.html#jsonResponses. я обновил свой ответ - person Mario; 08.10.2017
comment
Я пробовал. его возврат нулевой. почему список не нулевой, но когда он отображается как json, список становится нулевым: | - person dadang1234; 08.10.2017
comment
Не могли бы вы поделиться реальным примером кода? Возможно, в вашем образце чего-то нет. - person Mario; 08.10.2017
comment
здесь результат, когда я отображаю объект [com.Some : 1, com.Some : 3, com.Some : 5, com.Some : 2, com.Some : 4], но при отображении в формате JSON он возвращает значение null. - person dadang1234; 08.10.2017

Это случилось со мной только один раз, и я решил это, заставив ответ:

render(text: someList as JSON, contentType: 'application/json', encoding: 'UTF-8')

Это совершенно очевидно, но убедитесь, что метод находится внутри контроллера и имеет следующую конфигурацию:

static responseFormats = ['json', 'html']
person Ivan Pianetti    schedule 11.10.2017