2011-12-09 19 views
6

इसलिए मैं सामान्य रूप से नोडजेएस और जावास्क्रिप्ट सीख रहा हूं, और इसके साथ खेल रहा हूं और मुझे JSON को पार्स करने में कुछ समस्याएं हैं। मैं "उपयोगकर्ता" से निम्नलिखित प्राप्त करें:पार्सिंग JSON सरणी nodejs

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

मेरा प्रश्न मैं कैसे ठीक से इस पार्स अलग-अलग बिट्स प्राप्त करने के लिए कर सकते हैं: var करके

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

मैं यह कर की कोशिश कर रहा है jsonObject = JSON.parse (req.body); , लेकिन मुझे पार्सिंग त्रुटियां मिलती रहती हैं, इससे कोई फर्क नहीं पड़ता कि मैं जेएसओएन को कैसे बदलता हूं (व्यक्तिगत घटक, यह सब, आदि)।

क्या कोई भी बता सकता है कि मैं क्या गलत कर रहा हूं?

संपादित करें: तो मैं विभिन्न पथों से निपटने के लिए एक्सप्रेस का उपयोग करता हूं। तो मेरे पास 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':'[email protected]'},{'name':'a','number':'416','email':''}]}" http://localhost:3000/syncService 

संपादित करें: मैं मैं शायद आवेदन/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) 
+1

पार्सिंग त्रुटि क्या कहती है? आपको पूर्ण प्रतिक्रिया का विश्लेषण करना होगा और फिर पहले परिणाम के लिए result.sync_contact_list [0] तक पहुंच प्राप्त करनी होगी। – Daff

+1

इसे एक लाइनब्रेक-/spacefree json के साथ आज़माएं। क्या वह काम करता है? –

+0

@AronWoost सही हो सकता है। क्या आपके द्वारा प्रदान किए गए प्रारूप में उपयोगकर्ता ** डेटा ** से डेटा है? या आपने इसे स्टैक ओवरफ्लो के लिए प्रारूपित किया है? मुझे लगता है कि आप हमें केवल उस डेटा की संरचना दिखा रहे हैं, जिसे आप प्राप्त करना चाहते हैं, लेकिन हमें इसके प्रकार के साथ सटीक 'req.body' मान दिया जाना चाहिए ('typeof req.body' का आह्वान करने का प्रयास करें और हमें परिणाम दें)। – Tadeck

उत्तर

6

शायद यह पहले ही पार्स हो चुका है? मुझे नहीं पता (मैंने आपका पूरा कोड नहीं देखा)।

अगर ऐसा है, तो विशिष्ट "बिट्स" की तरह है कि (एक सबूत के लिए 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

तो यह पता चला कि मेरा JSON बुरी तरह से स्वरूपित था। जावा प्रोजेक्ट पर काम करने से मुझे बुरी आदत मिली। एक बार उस भाग को ठीक करने के बाद, मेरा अनुरोध डिफ़ॉल्ट रूप से पार्स हो रहा था, जिसके कारण मुझे कुछ अन्य सिरदर्द नहीं हुआ जब तक कि मुझे नोड-इंस्पेक्टर के बारे में पता नहीं चला।

नतीजतन, मैं सही जवाब के रूप में टेडेक का चयन कर रहा हूं।

+7

खराब प्रारूपण क्या था? – guiomie

संबंधित मुद्दे