2013-12-08 21 views
8

Ich muss in meinem Server in Knoten js geschrieben eine JSON-Zeichenfolge an den Client gesendet werden, wenn diese Anfrage es. Das Problem ist, dass dieser JSON von den verfügbaren Daten auf dem Server abhängt, daher ist die Größe des JSON-Arrays nicht immer gleich. Ich habe den ganzen Tag versucht, aber obwohl ich mich in der Nähe fühle, verstehe ich es immer noch nicht.Erstellen eines JSON-Array in Knoten js

Ein Beispiel Abfrage folgt:

json={"players":[ 
      {"name":"Messi", "goals":8},    
      {"name":"Ronaldo", "goals":22}, 
      {"name":"Costa", "goals":20}, 
      {"name":"Neymar", "goals":13}, 
      {"name":"Arabi", "goals":6}, 
      {"name":"Bale", "goals":3}, 
      {"name":"Toquero", "goals":0}]}; 

ich es an den Server senden würde von:

res.contentType('application/json'); 
res.send(json); 

Die JSON-Array, das schaffe ich möchte es auf einem Hash hängt 'Ziele' genannt, wo ein Spielername ist der Schlüssel und eine Anzahl von Zielen der Wert. Wenn also nur 3 Spieler vorhanden sind, sollte das JSON-Array nur diese Größe haben.

Ive versucht, die JSON-Array online wie diese zu erstellen:

result= ""; 
for(i in goals){ 
    result = result+ '{ name:' + i + ", goals:" + goals[i] + '},'; 
} 
result= result.substring(0, result.length - 1); 
res.contentType('application/json'); 
res.send({ 'players': [ result]}); 

jedoch nur der Client eine json der Größe erhält 1

Object {jugadores: Array[1]} 

jugadores: Array [1] 0: "{nombre: Messi, Goles: 8}, {nombre: Ronaldo, Goles: 16}, {nombre: Costa, Goles: 10}, {nombre: Toquero, Goles: 0}, {nombre: Arabi, Goles: 2}, {nombre: Bale, goles: 10}, {nombre: Neymar, goles: 8} " Länge: 1

Vielen Dank im Voraus, Im wirklich zu kämpfen mit :(

Edit: Ich versuche jetzt mit Stringy dies zu tun, aber kein Glück. Was mache ich falsch?

result= "players:["; 
for(i in goals){ 
    result= result+ '{ name:' + i + ", goals:" + goals[i] + '},'; 
} 

result= result.substring(0, resultado.length - 1); 
result= result + ']' 

res.contentType('application/json'); 
myJSONstring = JSON.stringify(resultado); 
res.send(myJSONstring); 

Tore Hash wird mit GET gefüllt:

app.get('/player/:id', function (req, res) { 
res.contentType('application/json'); 
res.send({'goals': + goals[req.params.id] }); 

});

+1

Verwendung res.send (JSON.stringify (Spieler)) und der Schleife und führen variable loszuwerden. –

+0

wie? Ich meine, wenn ich die Schleife los werde, erhalte ich nicht die Information, die ich senden möchte. – Rafag

+0

können Sie den Teil Ihres Codes anzeigen, in dem Sie den Wert von 'goals' setzen –

Antwort

28

Erstellen Sie eine JavaScript-Datenstruktur mit den erforderlichen Informationen, und drehen Sie sie am Ende in die JSON-Zeichenfolge.

Nach dem, was ich denke, Sie tun, versuchen, etwas wie folgt aus:

var result = []; 
for (var name in goals) { 
    if (goals.hasOwnProperty(name)) { 
    result.push({name: name, goals: goals[name]}); 
    } 
} 

res.contentType('application/json'); 
res.send(JSON.stringify(result)); 

oder etwas in diese Richtung.

+0

Es funktioniert! Danke euch beiden! – Rafag

7

Sie haben kein JSON. Sie haben eine JavaScript-Datenstruktur bestehend aus Objekten, einem Array, einigen Strings und einigen Zahlen.

Verwenden Sie JSON.stringify(object), um es in (eine Zeichenfolge) JSON-Text umzuwandeln.

+0

Ich habe versucht, die JavaScript-Datenstruktur zu erstellen und stringify verwenden (bitte überprüfen Sie meine Bearbeitung), aber kein Glück, was fehlt mir? – Rafag

+1

Sie versuchen, Ihre Datenstruktur zu konstruieren, indem Sie Strings zusammenkleben, die JS-Literale darstellen. Verwenden Sie tatsächliche Literale. – Quentin

1

Dies half mir,

res.format({ 
     json:function(){ 
          var responseData = {}; 
          responseData['status'] = 200; 
          responseData['outputPath'] = outputDirectoryPath; 
          responseData['sourcePath'] = url; 
          responseData['message'] = 'Scraping of requested resource initiated.'; 
          responseData['logfile'] = logFileName; 
          res.json(JSON.stringify(responseData)); 
         } 
    });