कैसे जांचा जाए कि किसी जावास्क्रिप्ट का जवाब जावास्क्रिप्ट में एक json ऑब्जेक्ट है या नहीं


94

मैं एक URL से JSON या टेक्स्ट को पुनः प्राप्त करने के लिए fetch polyfill का उपयोग कर रहा हूं, मैं जानना चाहता हूं कि मैं कैसे जांच सकता हूं कि प्रतिक्रिया JSON ऑब्जेक्ट है या यह केवल टेक्स्ट है

fetch(URL, options).then(response => {
   // how to check if response has a body of type json?
   if (response.isJson()) return response.json();
});

जवाबों:


162

आप content-typeप्रतिक्रिया के लिए जाँच कर सकते हैं , जैसा कि इस MDN उदाहरण में दिखाया गया है :

fetch(myRequest).then(response => {
  const contentType = response.headers.get("content-type");
  if (contentType && contentType.indexOf("application/json") !== -1) {
    return response.json().then(data => {
      // process your JSON data further
    });
  } else {
    return response.text().then(text => {
      // this is text, do something with it
    });
  }
});

यदि आपको यह सुनिश्चित करने की आवश्यकता है कि सामग्री मान्य JSON है (और हेडर पर भरोसा नहीं है), तो आप हमेशा केवल प्रतिक्रिया को स्वीकार कर सकते हैं textऔर इसे स्वयं पार्स कर सकते हैं:

fetch(myRequest)
  .then(response => response.text())
  .then(text => {
    try {
        const data = JSON.parse(text);
        // Do your JSON handling here
    } catch(err) {
       // It is text, do you text handling here
    }
  });

Async / इंतजार

यदि आप उपयोग कर रहे हैं async/await, तो आप इसे और अधिक रैखिक फैशन में लिख सकते हैं:

async function myFetch(myRequest) {
  try {
    const reponse = await fetch(myRequest); // Fetch the resource
    const text = await response.text(); // Parse it as text
    const data = JSON.parse(text); // Try to parse it as json
    // Do your JSON handling here
  } catch(err) {
    // This probably means your response is text, do you text handling here
  }
}

1
एक ही रणनीति के माध्यम से आप बस प्रतिक्रिया का उपयोग कर सकते हैं। पकड़ के साथ संयोजन में यदि आप कोई त्रुटि पकड़ते हैं, तो इसका मतलब है कि यह कोई जुबान नहीं है। क्या इसे संभालने का अधिक मुहावरेदार तरीका नहीं होगा (इसके बजाय प्रतिक्रिया को रोकना)।
राउटरटेल्टैप

3
@WouterRonteltap: आपको केवल एक या दूसरे को करने की अनुमति नहीं है। ऐसा लगता है जैसे मुझे याद है कि आप केवल एक शॉट पर प्रतिक्रिया देते हैं। कुछ भी ()। यदि ऐसा है, तो JSON पाठ है, लेकिन पाठ जरूरी JSON नहीं है। इसलिए, आपको पहले सुनिश्चित करना होगा, जो कि .text () है। यदि आप .json () पहले करते हैं, और यह विफल रहता है, मुझे नहीं लगता कि आपको .text () करने का अवसर मिलेगा। अगर मैं गलत हूं, तो कृपया मुझे अलग दिखाओ।
लोनी बेस्ट

2
मेरी राय में आप हेडर पर भरोसा नहीं कर सकते हैं (भले ही आपको करना चाहिए, लेकिन कभी-कभी आप बस दूसरी तरफ सर्वर को नियंत्रित नहीं कर सकते हैं)। इसलिए यह बहुत अच्छा है कि आप अपने उत्तर में ट्राइ-कैच का भी उल्लेख करें।
जैकब

2
हां, @ लॉनी बेस्ट इसमें पूरी तरह से सही है। यदि आप .json () को कॉल करते हैं और यह एक अपवाद को फेंक देता है (क्योंकि प्रतिक्रिया जौन नहीं है), तो आपको "बॉडी पहले ही भस्म हो चुकी है" अपवाद मिलेगा यदि आप बाद में .text ()
एंडी

1

JSON.parse जैसे JSON पार्सर का उपयोग करें:

function IsJsonString(str) {
    try {
        var obj = JSON.parse(str);

         // More strict checking     
         // if (obj && typeof obj === "object") {
         //    return true;
         // }

    } catch (e) {
        return false;
    }
    return true;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.