2009-10-22 15 views
5

EDIT मैंने jQuery दस्तावेज़ों की जांच की और जेसन डेटाटाइप निर्दिष्ट $ .ajax का उपयोग करके एक मूल्यांकन जावास्क्रिप्ट ऑब्जेक्ट देता है, इसलिए eval() यहां जवाब नहीं है। मुझे पता था कि वैसे भी, क्योंकि मैं एकल JSON ऑब्जेक्ट्स को पार्स करने में सक्षम हूं, सिर्फ सरणी नहीं। समस्या $ है। उनके माध्यम से मेरे रास्ते में प्रवेश करें :)jQuery में JSON सरणी का विश्लेषण कैसे करें?

मैंने पत्र में jQuery में JSON सरणी को पार्स करने के लिए वाक्यविन्यास का पालन किया है, लेकिन यह किसी कारण से काम नहीं करता है। मैं $ .ajax का उपयोग करके सरणी ला रहा हूं, सही डेटाटाइप निर्दिष्ट किया है, और फायरबग में देख सकता है कि मेरी PHP स्क्रिप्ट से प्रतिक्रिया [] है। फिर भी जब मैं सरणी के माध्यम से पुन: प्रयास करने के लिए $ .each का उपयोग करने का प्रयास करता हूं, तो जब मैं कंसोल करने की कोशिश करता हूं तो मुझे सभी अनिर्धारित मान मिलते हैं। सरणी के विभिन्न हिस्सों को लॉग इन करें। यह वह स्थान है, जहां मेरे PHP स्क्रिप्ट बनाता है और सरणी encodes:

if(mysqli_num_rows($new_res) > 0) { 
$messages = array(); 

while($message_data = mysqli_fetch_assoc($query_res)) { 
    $message = array(
    'poster' => $message_data['poster'], 
    'message' => $message_data['message'], 
    'time' => $message_data['time'] 
); 

    $messages[] = $message; 
} 

echo json_encode($messages); 
} else if(mysqli_num_rows($new_res) == 0) { 
$message = array(
    'poster' => '', 
    'message' => 'No messages!', 
    'time' => 1 
); 

echo json_encode($message); 
} 

और यहाँ यह पार्स करने के लिए मेरे प्रयास है:

var logged_in = '<?php echo $logged_in; ?>'; 
    var poster = '<?php echo $_SESSION["poster"];?>'; 
    $.ajax({ 
    url: 'do_chat.php5', 
    type: 'post', 
    data: ({'poster':poster,'logged_in':logged_in}), 
    dataType: 'json', 
    success: function(data) { 
     $.each(data, function(messageIndex, message) { 
        console.log(parseInt($('#chatWindow :last-child > span').html())+' '+message['time']); 
     if((parseInt(message['time']) > parseInt($('#chatWindow :last-child > span').html()))) { 
    $('#chatWindow').append('<div class="poster">'+message['poster']+'</div><div class="message"><span>'+message['time']+'</span>'+message['message']+'</div>'); 
     } 
     }); 
    } 
    }); 
$ .प्रत्येक समारोह के बिना

मैं सफलतापूर्वक एक JSON ऑब्जेक्ट को पार्स करने में सक्षम हूँ , लेकिन एक सरणी नहीं है। यह JSON और $ .each के साथ मेरा पहला आउटिंग है, और मैं jQuery के लिए बहुत नया हूं, इसलिए अगर मेरे कोड में बदसूरत बिट्स हैं तो आसान हो जाओ!

+0

क्या आप कोई समाधान ढूंढने में कामयाब रहे? यदि ऐसा है तो मैं एक उत्तर चुनने का सुझाव देता हूं: पी –

+0

मैंने अभी तक नहीं किया, नहीं। मैंने संपादित किया लेकिन कोई और जवाब नहीं मिला। समस्या या तो PHP JSON ऑब्जेक्ट को एन्कोड कर रहा है या $ .each वाक्यविन्यास के साथ है। मैं कंसोलप्रतिक्रिया डेटा लॉग इन करें, और उसके बाद eval() - इसे संपादित करें और कंसोल लॉग इन करें और मुझे वही चीज़ मिलती है, इसलिए eval जवाब नहीं था। – user97410

उत्तर

0

आपका data समय में उस बिंदु पर '[{}]' की एक श्रृंखला है, तो आप ऐसा है जैसे कि यह eval कर सकते हैं:

function(data) { 
    data = eval('(' + data + ')') 
} 

हालांकि इस विधि सुरक्षित से दूर है, इस में कुछ अधिक परिश्रम लेकिन सबसे अच्छा अभ्यास हो जाएगा Crockford के JSON पार्सर के साथ यह पार्स करने के लिए है: https://github.com/douglascrockford/JSON-js

एक अन्य विधि $.getJSON हो सकता है और आप एक शुद्ध jQuery निर्भर विधि के लिए JSON के dataType सेट करना होगा।

+0

क्या यह न केवल काम करता है अगर सरणी जो php jason_encodes एक एकल स्तर सरणी है? उदाहरण के लिए, जेएसओएन ऑब्जेक्ट जेनरेट करने वाला मूल कोड देखें। केवल उस स्थिति में जब डेटाबेस क्वेरी कोई परिणाम उत्पन्न नहीं करती है, सरणी एक-आयामी है, अन्यथा यह बहुआयामी है। – user97410

+0

ओह मैंने उस भाग को नहीं देखा .. एचएम –

+0

ठीक है - आपको अभी भी इसका मूल्यांकन करना चाहिए, अब यह आपके कोड में उस बिंदु पर एक स्ट्रिंग है जो मुझे विश्वास है। –

0

आप अपने लिए JSON पार्स करने के लिए जावास्क्रिप्ट eval() फ़ंक्शन का उपयोग कर सकते हैं। एक बेहतर विवरण के लिए the JSON website देखें, लेकिन आप करने के लिए अपनी सफलता समारोह को बदलने के लिए सक्षम होना चाहिए ...

var returnedObjects = eval(data); 
var i = 0; 
for (i = 0; i < returnedObjects.length; i++){ 
    console.log('Time: ' + returnedObjects[i].time); 
} 

... या कुछ बंद।

+0

मुझे लगता है कि यह प्रभावी रूप से $ .each करना है, और मैंने सोचा था कि एक जेसन डेटाटाइप के साथ $ .ajax का उपयोग करना मतलब था कि प्रतिक्रिया डेटा पूर्व-eval-ed आया था। हालांकि मैं कोशिश करूँगा :) – user97410

1

eval साथ सावधान, JSON विशिष्टता जैसी

var myObject = eval('(' + myJSONtext + ')'); 

कुछ सलाह देते हैं http://json.org/js.html और वहाँ कुछ और gotchas हो सकता है। वहाँ jQuery के लिए एक प्लगइन है कि यह ध्यान रखना होगा, मैं लगता है: var myObject = JSON.parse(data); इस lib उपयोग करें:

http://code.google.com/p/jquery-json/

+1

वाह, यह प्लगइन अच्छा लग रहा है! – cimnine

13

नहीं है, eval के साथ, आप JSON पार्सर कि ज्यादा सुरक्षित है उपयोग कर सकते हैं सुरक्षित नहीं है https://github.com/douglascrockford/JSON-js

+1

JSON पृष्ठ से: 'eval function बहुत तेज़ है। हालांकि, यह किसी भी जावास्क्रिप्ट प्रोग्राम को संकलित और निष्पादित कर सकता है, इसलिए सुरक्षा समस्याएं हो सकती हैं –

+0

धन्यवाद। मैं अपना पाठ सही करता हूं। लूप के लिए – Cesar

0

आप link on the JSON.org website से एक JSON पार्सर डाउनलोड कर सकते हैं जो बहुत अच्छा काम करता है, आप सामग्री को देखने के लिए JSON भी स्ट्रिंग कर सकते हैं।

इसके अलावा, अगर आप EVAL उपयोग कर रहे हैं और यह एक JSON सारणी है तो आप निम्न synrax का उपयोग करना होगा:

eval('([' + jsonData + '])');

-1

eval नहीं है। एक वास्तविक पार्सर का उपयोग करें, यानी, Json.org

5

मैं जानता हूँ कि यह बहुत लंबा है अपनी पोस्ट के बाद, लेकिन जो दूसरों इस समस्या का सामना किया जा सकता है के लिए पोस्ट और मैं के रूप में इस पोस्ट को भूल गए हैं करना चाहते थे किया।

ऐसा लगता है कि jquery के $.each के बारे में कुछ ऐसा है जो सरणी में तत्वों की प्रकृति को बदलता है।

मैं निम्नलिखित करना चाहता था:

$.getJSON('/ajax/get_messages.php', function(data) { 

    /* data: 

    [{"title":"Failure","details":"Unsuccessful. Please try again.","type":"error"}, 
    {"title":"Information Message","details":"A basic informational message - Please be aware","type":"info"}] 

    */ 

    console.log ("Data0Title: " + data[0].title); 
    // prints "Data0Title: Failure" 

    console.log ("Data0Type: " + data[0].type); 
    // prints "Data0Type: error" 

    console.log ("Data0Details: " + data[0].details); 
    // prints "Data0Details: Unsuccessful. Please try again" 


    /* Loop through data array and print messages to console */ 

}); 

पाश पूरा करने के लिए, मैं पहली बार डेटा सरणी के माध्यम से पाश के लिए एक jQuery $.each उपयोग करने की कोशिश। हालांकि, ओपी नोटों के रूप में, यह सही काम नहीं करता:

$.each(data, function(nextMsg) {  
    console.log (nextMsg.title + " (" + nextMsg.type + "): " + nextMsg.details); 
    // prints 
    // "undefined (undefined): undefined 
    // "undefined (undefined): undefined 
}); 

यही मतलब नहीं था के बाद से मैं जब डेटा सरणी पर एक संख्यात्मक कुंजी का उपयोग कर data[0] तत्वों का उपयोग करने में सक्षम हूँ। तो बाद का उपयोग कर एक संख्यात्मक सूचकांक काम किया, मैंने कोशिश की (सफलतापूर्वक) पाश के लिए एक साथ $.each ब्लॉक की जगह:

var i=0; 
for (i=0;i<data.length;i++){ 
    console.log (data[i].title + " (" + data[i].type + "): " + data[i].details); 
    // prints 
    // "Failure (error): Unsuccessful. Please try again" 
    // "Information Message (info): A basic informational message - Please be aware" 
} 

तो मैं मूल समस्या पता नहीं है, पाश के लिए एक बुनियादी, पुराने जमाने जावास्क्रिप्ट प्रतीत हो रहा है करने के लिए एक कार्यात्मक विकल्प jQuery के $.each

+0

+1। मुझे कुछ टाइपिंग बचाया :) –

2

मैं पार्स करने के लिए JSON डेटा एक ajax कॉल से लौटे कोशिश कर रहा हूँ, और निम्न मेरे लिए काम कर रहा है:

नमूना PHP कोड

$portfolio_array= Array('desc'=>'This is test description1','item1'=>'1.jpg','item2'=>'2.jpg'); 

echo json_encode($portfolio_array); 

और .js में, मैं इस तरह पार्स करने हूँ:

var req=$.post("json.php", { id: "" + id + ""}, 
function(data) { 
    data=$.parseJSON(data); 
    alert(data.desc); 
    $.each(data, function(i,item){ 
    alert(item); 
    }); 
}) 
.success(function(){}) 
.error(function(){alert('There was problem loading portfolio details.');}) 
.complete(function(){}); 

आप की तरह

नीचे
$portfolio_array= Array('desc'=>'This is test description 1','items'=> array('item1'=>'1.jpg','item2'=>'2.jpg')); 
echo json_encode($portfolio_array); 

तो नीचे दिए गए कोड काम करना चाहिए बहुआयामी सरणी है:

var req=$.post("json.php", { id: "" + id + 
    function(data) { 
    data=$.parseJSON(data); 
    alert(data.desc); 
    $.each(data.items, function(i,item){ 
    alert(item); 
    }); 
}) 
.success(function(){}) 
.error(function(){alert('There was problem loading portfolio details.');}) 
.complete(function(){}); 

कृपया ध्यान दें कि उप सरणी कुंजी यहां आइटम है, और मान लीजिए कि आपके पास xyz है तो data.items के स्थान परका उपयोग करें

2

.NET 3.5 ठीक

तुम सब थोड़ा गलत हैं, लेकिन अपने प्रयासों के सभी के संयोजन का लाभ मिला है का उपयोग करना!

eval के बजाय ('([' + jsonData + '])');

success: function(msg){ 
var data = eval(msg.d); 
var i=0; 
for(i=0;i<data.length;i++){ 
    data[i].parametername /// do whatever you want here. 
}; 

मैं पूरी बारे में कुछ पता है नहीं "eval का उपयोग नहीं करते हैं," लेकिन मैं क्या जानते हो कि '([' + msg + '])' आप घोंसला बनाने से कर रहे हैं उन करके है एक स्तर की बजाय गहरी वस्तुएं।

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