web-dev-qa-db-fra.com

Rendre JSON en 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 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 tableau d'objets. Existe-t-il un moyen de rendre les données de résultats sous la forme d'un tableau d'éléments. Comme

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

La manière dont l'objet JSON est en cours de construction est assez obscure. Ce que j'aime faire pour rendre les réponses JSON dans Grails, c'est créer une carte ou une liste dans groovy, puis utiliser la méthode render pour la convertir au format JSON.

Faire la transformation de rowResult à l'intérieur de la méthode de rendu le rend assez déroutant, 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 dans le tableau results, mais uniquement des chaînes.

Notez l'utilisation de rows, qui retourne une liste de RowResult, éliminant le besoin de l'obtenir à partir du ResultSet. 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 le code JSON { "A":"value1"} que vous obteniez), mais le même résultat obtenu avec l'opérateur << dans une nouvelle liste vide.

Avec la méthode de rendu, nous déclarons simplement le type de contenu text/json et lui transmettons une carte littérale contenant les clés results et status que vous souhaitez écrire dans la réponse. L'opérateur conditionnel est utilisé pour déterminer le statut de manière concise. 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
35
Esteban

Seulement par un peu :) Il suffit de changer

aMap.put("A", a)

ê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!

En tant que note, il existe un convertisseur JSON dans Grails qui vous aidera à créer cette chaîne. Regardez dedans ici

5
Will Buck

Cela devrait suffire à rendre un JSON à partir du contrôleur:

render results as grails.converters.JSON
0
IgniteCoders