2011-12-09 4 views
6

quindi sto imparando NodeJS e javascript in generale, e sto giocando con esso e ho qualche problema nell'analisi di un JSON. Ricevo il seguente dal "utente":Parsing JSON array nodejs

{ 
    "sync_contact_list": [ 
    { 
     "name": "c", 
     "number": "789", 
     "email": "" 
    }, 
    { 
     "name": "b", 
     "number": "123", 
     "email": "[email protected]" 
    }, 
    { 
     "name": "a", 
     "number": "416", 
     "email": "" 
    } 
    ] 
} 

La mia domanda è come posso analizzare correttamente questo per ottenere i singoli bit:

{ 
    "name": "a", 
    "number": "416", 
    "email": "" 
} 

Ho cercato di farlo facendo var jsonObject = JSON.parse (req.body); , ma continuo ad avere errori di analisi, indipendentemente da come modifico il JSON che ricevo (singoli componenti, tutto il resto, ecc.).

Qualcuno potrebbe far notare cosa sto facendo male?

MODIFICA: Quindi uso express per gestire i diversi percorsi. Quindi ho app.js:

var express = require('express') 
    , routes = require('./routes') 
//var mysql = require('mysql'); 
var app = module.exports = express.createServer(); 

// Configuration 

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    //app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.configure('production', function(){ 
    app.use(express.errorHandler()); 
}); 

// Routes 

//app.post('/', routes.syncServiceIndex); 

app.post('/syncService', routes.synchServicePost); 
app.get('/syncService/:syncServiceUser/sync', routes.synchServiceSync); 
app.post('/syncService/:syncServiceUser/push', routes.synchServicePush); 
app.del('/syncService/:syncServiceUser', routes.synchServiceDel); 

app.post('/syncService/:syncServiceUser/contacts/push', routes.synchServiceContactsPush); 
app.get('/syncService/:syncServiceUser/contacts/sync', routes.synchServiceContactsSync); 

app.post('/syncService/:syncServiceUser/contacts/', routes.synchServiceContactsPost); 
app.get('/syncService/:syncServiceUser/contacts/:contactId', routes.synchServiceContactsGet); 
app.put('/syncService/:syncServiceUser/contacts/:contactId', routes.synchServiceContactsPut); 
app.del('/syncService/:syncServiceUser/contacts/:contactId', routes.synchServiceContactsDel); 


app.listen(3000); 


console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); 

E poi ho index.js, dove fondamentalmente ho il seguente per ogni percorso.

exports.synchServicePost = function(req, res) { 
    console.log('synchServicePost'); 
    console.log("BODY:"+JSON.stringify(req.body)); 
    var jsonObject = JSON.parse(req.body); 


    res.statusCode = 200; 
    res.send("OK\n"); 
} 

La richiesta è realizzato con un JSON gratuito di linea:

curl -i -d "{'sync_contact_list':[{'name':'c','number':'789','email':''},{'name':'b','number':'123','email':'[email protected]'},{'name':'a','number':'416','email':''}]}" http://localhost:3000/syncService 

EDIT: mi sono reso conto probabilmente dovrei cambiare il tipo di contenuto application/json. in questo caso, per JSON.stringify ottengo il seguente:

SyntaxError: Unexpected token ILLEGAL 
at parse (native) 
at IncomingMessage.<anonymous> (/home/alex/peekcode/quipmail/synch/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:71:15) 
at IncomingMessage.emit (events.js:61:17) 
at HTTPParser.onMessageComplete (http.js:133:23) 
at Socket.ondata (http.js:1029:22) 
at Socket._onReadable (net.js:677:27) 
at IOWatcher.onReadable [as callback] (net.js:177:10) 
+1

Cosa dice l'errore di parsing? È necessario analizzare la risposta completa e quindi accedere a result.sync_contact_list [0] per il primo risultato. – Daff

+1

Provalo con un josh senza interruzioni di riga/spazio. Funziona? –

+0

@AronWoost potrebbe avere ragione. I dati dell'utente ** sono esattamente ** nel formato che hai fornito? O hai appena formattato per StackOverflow? Presumo che tu ci stia mostrando solo la struttura dei dati che vuoi ricevere, ma dovremmo avere il valore esatto di 'req.body' insieme al suo tipo (prova a richiamare' typeof req.body' e forniscici il risultato). – Tadeck

risposta

6

Forse è già stato analizzato? Non lo so (non ho visto il tuo intero codice).

Se è (o si analizzerà il modo è necessario), quindi specifici "bit" saranno disponibili come quello (si veda this jsfiddle per una prova):

for (var i=0; i<jsonObject['sync_contact_list'].length; i++){ 
    // here jsonObject['sync_contact_list'][i] is your current "bit" 
} 

All'interno del ciclo, tra le iterazioni , jsonObject['sync_contact_list'][i] cambia tra i "bit", perché i cambia e punta al primo elemento, quindi al secondo e così via fino all'ultimo elemento.

2

Quindi il mio JSON era formattato male. Cattiva abitudine ho ottenuto lavorando su un progetto Java. Una volta risolta la parte, la mia richiesta veniva analizzata per impostazione predefinita, causando un altro mal di testa fino a quando non ho scoperto su node-inspector.

Come risultato, sto selezionando Tadeck come la risposta giusta.

+7

Qual è stata la formattazione errata? – guiomie