Разбор массива JSON nodejs - PullRequest
       2

Разбор массива JSON nodejs

6 голосов
/ 09 декабря 2011

, поэтому я изучаю NodeJS и javascript в целом, и играюсь с ним, и у меня возникают некоторые проблемы с анализом JSON. От пользователя я получаю следующее:

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

Мой вопрос: как мне правильно разобрать это, чтобы получить отдельные биты:

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

Я пытался сделать это, выполнив var jsonObject = JSON.parse (req.body); , но я продолжаю получать ошибки синтаксического анализа, независимо от того, как я изменяю JSON, который я получаю (отдельные компоненты, все это и т. д.).

Кто-нибудь может указать, что я делаю неправильно?

EDIT: Поэтому я использую экспресс, чтобы справиться с различными путями. Итак, у меня есть 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);

И затем у меня есть index.js, где у меня есть в основном следующее для каждого маршрута.

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");
}

Запрос сделан без строки JSON:

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

РЕДАКТИРОВАТЬ: я понял, что, вероятно, я должен изменить тип содержимого на application / json. в этом случае для JSON.stringify я получаю следующее:

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)

Ответы [ 3 ]

6 голосов
/ 09 декабря 2011

Может это уже разобрали? Я не знаю (я не видел весь ваш код).

Если это так (или вы проанализируете его так, как вам нужно), то будут доступны определенные «биты», подобные этим (см. this jsfiddle для доказательства):

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

В цикле между итерациями jsonObject['sync_contact_list'][i] изменяется между «битами», потому что i изменяется и указывает на первый элемент, затем на второй и т. Д. До последнего элемента.

2 голосов
/ 14 декабря 2011

Получается, что мой JSON был плохо отформатирован.Плохая привычка, которую я получил от работы над проектом Java.Как только эта часть была исправлена, мой запрос обрабатывался по умолчанию, что вызывало некоторую другую головную боль, пока я не узнал об узле-инспекторе.

В результате я выбираю Tadeck как имеющий правильный ответ.1003 *

0 голосов
/ 18 июля 2018
for(count in sync_contact_list) {
           console.log('individual json objects list', JSON.stringify(sync_contact_list[count]));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...