আনার প্রতিক্রিয়াটি জাভাস্ক্রিপ্টে কোনও জেসন অবজেক্ট কিনা তা কীভাবে পরীক্ষা করবেন


100

আমি কোনও ইউআরএল থেকে জেএসএন বা পাঠ্য পুনরুদ্ধার করার জন্য আনতে পলিফিল ব্যবহার করছি, আমি জানতে চাই যে কীভাবে প্রতিক্রিয়াটি কোনও জেএসওএন অবজেক্ট বা এটি কেবল পাঠ্য

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

উত্তর:


178

এই এমডিএন উদাহরণেcontent-type প্রদর্শিত হিসাবে আপনি প্রতিক্রিয়াটির জন্য পরীক্ষা করতে পারেন :

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

আপনার যদি সামগ্রিকভাবে নিশ্চিত হওয়া দরকার যে সামগ্রীটি বৈধ জেএসএন (এবং শিরোনামগুলিতে বিশ্বাস করবেন না), আপনি সর্বদা প্রতিক্রিয়াটিকে কেবল 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/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
  }
}

4
একই কৌশলটির মাধ্যমে আপনি কেবল প্রতিক্রিয়ার জন্য ব্যবহার করতে পারেন: ধরা পড়ার সাথে মিশ্রণে জসন; যদি আপনি কোনও ত্রুটি ধরেন তবে এর অর্থ এটি জসন নয়। এটিকে কীভাবে পরিচালিত করার পক্ষে আরও একটি অলঙ্কৃত উপায় হবে না (প্রতিক্রিয়ার পরিবর্তে)?
ওয়াউটার রন্টেলটাপ

4
@ ওয়াটাররনটেলট্যাপ: আপনি কেবল একটি বা অন্যটি করার অনুমতি দিচ্ছেন না। দেখে মনে হচ্ছে মনে হচ্ছে আপনি প্রতিক্রিয়াতে কেবল একটি শট পেয়েছেন any কিছুই না ()। যদি তা হয় তবে জেএসএনটি পাঠ্য, তবে পাঠ্যটি অগত্যা জেএসএন নয়। অতএব, আপনাকে প্রথমে নিশ্চিত-জিনিসটি করতে হবে, যা .text ()। আপনি যদি প্রথমে .json () করেন এবং এটি ব্যর্থ হয় তবে আপনি .text () করার সুযোগ পাবেন বলে আমি মনে করি না। আমি যদি ভুল হয়ে থাকি তবে দয়া করে আমাকে আলাদা দেখান।
লনি সেরা

4
আমার মতে আপনি শিরোনামকে বিশ্বাস করতে পারবেন না (যদিও আপনার হওয়া উচিত তবে কখনও কখনও আপনি কেবল অন্যদিকে সার্ভারটি নিয়ন্ত্রণ করতে পারবেন না)। সুতরাং এটি দুর্দান্ত যে আপনি নিজের উত্তরের চেষ্টাও উল্লেখ করেছেন।
জ্যাকব

4
হ্যাঁ, @ লনি বেস্ট এতে সম্পূর্ণ সঠিক। যদি আপনি .json () কল করেন এবং এটি একটি ব্যতিক্রম ছোঁড়ে (কারণ প্রতিক্রিয়াটি জসন নয়) তবে আপনি পরে "টেক্সট" () এ কল করলে একটি "বডি ইতিমধ্যে গ্রাস হয়ে গেছে" ব্যতিক্রম পাবেন
অ্যান্ডি

3

আপনি কোনও সহায়ক ফাংশন দিয়ে এটি পরিষ্কারভাবে করতে পারেন:

const parseJson = async response => {
  const text = await response.text()
  try{
    const json = JSON.parse(text)
    return json
  } catch(err) {
    throw new Error("Did not receive JSON, instead received: " + text)
  }
}

এবং তারপরে এটি ব্যবহার করুন:

fetch(URL, options)
.then(parseJson)
.then(result => {
    console.log("My json: ", result)
})

এটি ত্রুটি ছুঁড়ে দেবে যাতে আপনি চাইলে catchএটি করতে পারেন।


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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.