19 votes

Rendu JSON dans grails

J'utilise le code suivant pour rendre les données au format 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"
    }
}

Le code ci-dessus génère du JSON au format suivant

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

Comme vous le voyez ci-dessus, les données sont rendues sous la forme d'un fichier de type tableau d'objets . Existe-t-il un moyen de rendre les données de résultats sous la forme d'un fichier de type tableau d'éléments . Comme

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

38voto

Esteban Points 914

La façon dont l'objet JSON est construit est assez obscure. Ce que j'aime faire pour rendre des réponses JSON dans grails, c'est créer une carte ou une liste en groovy, puis utiliser la fonction render juste pour le convertir en JSON.

Faire la transformation de la rowResult dans la méthode de rendu est assez confuse, je préférerais quelque chose comme ceci

def results = db.rows(query).collect { rowResult ->
    b(rowResult.name, c, d) 
}
render(contentType: 'text/json') {[
    'results': results,
    'status': results ? "OK" : "Nothing present"
]}

Je pense que c'est plus lisible, et même plus court. Cet extrait vous permet d'obtenir le résultat souhaité : aucun objet à l'intérieur de l'objet results tableau, juste des chaînes de caractères.

Notez l'utilisation de rows qui renvoie une liste de RowResult's, éliminant ainsi le besoin de l'obtenir à partir des ResultSet's. La liste est utilisée pour collecter la valeur transformée a en appelant b sur le nom de chaque ligne. La collecte des éléments n'implique pas la création d'une carte (comme dans l'application { "A":"value1"} JSON que vous obteniez), tout comme @will-buck l'a fait avec le fichier << sur une nouvelle liste vide.

Tout ce que nous faisons avec la méthode de rendu, c'est déclarer l'élément text/json et en lui passant une carte littérale contenant les clés results y status que vous voulez écrire dans la réponse. L'opérateur conditionnel est utilisé pour déterminer de manière concise l'état. Il pourrait également être utilisé comme ceci, au moyen du convertisseur JSON @will-buck également mentionné :

def responseData = [
    'results': results,
    'status': results ? "OK" : "Nothing present"
]
render responseData as JSON

6voto

Will Buck Points 1225

Seulement un peu de décalage :) Il faut juste changer

aMap.put("A", a)

pour être une collection ou une liste, plutôt qu'une carte. donc quelque chose comme

def aList = []
aList << a

Vous obtiendrez ce que vous voulez !

Par ailleurs, il existe un convertisseur JSON dans Grails qui permet de construire des chaînes de caractères pour vous. Consultez-le aquí

2voto

MansApps Points 219

Cela devrait être suffisant pour rendre un JSON à partir du contrôleur :

render results as grails.converters.JSON

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X