2011-12-09 29 views
6

, así que estoy aprendiendo NodeJS y javascript en general, y estoy jugando con él y tengo algunos problemas para analizar un JSON. Recibo el siguiente desde el "usuario":Análisis JSON array nodejs

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

Mi pregunta es ¿cómo puedo analizar correctamente esto para conseguir los bits individuales:

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

que he estado tratando de hacerlo haciendo var jsonObject = JSON.parse (req.body); , pero sigo recibiendo errores de análisis, no importa cómo varíe el JSON que recibo (componentes individuales, todo, etc.).

¿Alguien podría señalar lo que estoy haciendo mal?

EDITAR: Así que uso express para tratar con las diferentes rutas. Así que tengo 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); 

Y luego tengo index.js, donde básicamente tengo lo siguiente para cada ruta.

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 solicitud se realiza con una línea de JSON libre:

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: me di cuenta de que probablemente debería cambiar el tipo de contenido application/json. en este caso, por JSON.stringify consigo el siguiente:

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

¿Qué dice el error de análisis? Debe analizar la respuesta completa y luego acceder a result.sync_contact_list [0] para obtener el primer resultado. – Daff

+1

Pruébalo con un json linebreak// spacefree. ¿Eso funciona? –

+0

@AronWoost puede estar en lo cierto. ¿Los datos del usuario ** son exactamente ** en el formato que proporcionó? ¿O acabas de formatearlo para StackOverflow? Supuse que nos está mostrando solo la estructura de los datos que desea recibir, pero se nos debe dar el valor exacto de "req.body" junto con su tipo (intente invocar 'typeof req.body' y dénos el resultado). – Tadeck

Respuesta

6

Tal vez se analiza ya? No lo sé (no vi todo tu código).

Si es (o se analizará la manera que lo necesita), entonces "bits" específicos estarán disponibles así (ver this jsfiddle de la prueba):

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

Dentro del bucle, entre las iteraciones , jsonObject['sync_contact_list'][i] cambia entre los "bits", porque i cambia y apunta al primer elemento, luego al segundo, y así sucesivamente, hasta el último elemento.

2

Así que resulta que mi JSON estaba mal formateado. Mal hábito que obtuve al trabajar en un proyecto de Java. Una vez que se arregló esa parte, mi solicitud fue analizada de manera predeterminada, lo que causó otro dolor de cabeza hasta que descubrí el nodo inspector.

Como resultado, selecciono Tadeck por tener la respuesta correcta.

+7

¿Cuál fue el formato incorrecto? – guiomie