← Back to JavaScript Course | Chapter 9: Async & Web APIs | Lesson 25 of 26

JS JSON से HTML

एक बार JSON data fetch और parse हो जाने पर, इसे आमतौर पर page पर दिखने वाले HTML में बदलना होता है -- objects की एक array पर loop करना, हर एक के लिए DOM elements या HTML strings बनाना, और result को page में डालना, किसी भी ऐसे content को escape करने का ध्यान रखते हुए जिसे वरना HTML के रूप में गलत समझा जा सकता हो।
Syntax
javascript
const object = JSON.parse(jsonText);
element.innerHTML = object.property;

DOM API से JSON से Elements बनाना

किसी parsed JSON array पर loop करना और, हर item के लिए, document.createElement() कॉल करके properties (जैसे textContent) सेट करना safely असली DOM elements बनाता है -- खासतौर पर textContent यह सुनिश्चित करता है कि किसी भी text को plain text की तरह treat किया जाए, कभी HTML के रूप में interpret न किया जाए।

Note: JSON-derived content render करने के सबसे सुरक्षित default approach के रूप में createElement() और textContent इस्तेमाल करें, खासतौर पर जब उस content में से कोई user input से आया हो सकता है।
Warning: इस तरह कई elements बनाना, हर item के लिए एक .createElement() और कई property assignments, एक HTML string बनाने से ज़्यादा verbose है, हालांकि डिफ़ॉल्ट रूप से काफी ज़्यादा सुरक्षित।

उदाहरण: Building Elements from JSON with the DOM API

javascript
const items = [{ name: "Sam" }, { name: "Amit" }];
const list = document.createElement("ul");
items.forEach(item => {
  const li = document.createElement("li");
  li.textContent = item.name; // treated as plain text, never HTML
  list.appendChild(li);
});
document.body.appendChild(list);

Template Literals से एक HTML String बनाना

.map() को एक template literal के साथ मिलाना हर JSON item के लिए एक HTML string बनाता है, फिर .join("") उन्हें innerHTML से डालने के लिए तैयार एक string में मिला देता है -- elements को individually बनाने से ज़्यादा संक्षिप्त, पर किसी untrusted content के लिए manual escaping चाहिए।

Note: template-literal-string approach को खासतौर पर उस JSON data के लिए रखें जिस पर आप पूरी तरह भरोसा करते हैं (जैसे अपना खुद का API), क्योंकि वरना इसे manual escaping चाहिए।
Warning: untrusted, un-escaped user content वाली एक template-literal-built string को innerHTML से डालना एक असली cross-site scripting (XSS) vulnerability है।

उदाहरण: Building an HTML String with Template Literals

javascript
// Declare the constant `items`, set to `[{ name: "Sam" }, { name: "Amit" }]`
// Declare the constant `items`, set to `[{ name: "Sam" }, { name: "Amit" }]`
const items = [{ name: "Sam" }, { name: "Amit" }];
// Declare the constant `html`, set to `items.map(item => `<li>${item.name}</li>`).join("")`
// Declare the constant `html`, set to `items.map(item => `<li>${item.name}</li>`).join("")`
const html = items.map(item => `<li>${item.name}</li>`).join("");
// Assign `<ul>${html}</ul>` to `document.body.innerHTML`
// Assign `<ul>${html}</ul>` to `document.body.innerHTML`
document.body.innerHTML = `<ul>${html}</ul>`;

एक खाली JSON Array संभालना

एक JSON response में सही तरीके से एक खाली array हो सकती है -- rendering code को इसे explicitly जांचना चाहिए और एक साफ "no results" या "nothing here yet" message दिखाना चाहिए, चुपचाप एक blank area छोड़ने के बजाय जो एक जानबूझकर empty state के बजाय एक bug जैसा दिखे।

Note: rendering से पहले या उसके दौरान हमेशा एक खाली array के लिए एक explicit check जोड़ें, एक blank gap छोड़ने के बजाय एक designed empty state दिखाते हुए।
Warning: एक unhandled खाली array से बना एक blank area, जिसमें कोई explanation नहीं, एक legitimate "यहाँ कुछ नहीं है" result के बजाय एक loading bug समझ लिया जाना आसान है।

उदाहरण: Handling an Empty JSON Array

javascript
// Declare the constant `items`, set to `[]`
// Declare the constant `items`, set to `[]`
const items = [];
// Assign `items.length` to `document.body.innerHTML`
// Assign `items.length` to `document.body.innerHTML`
document.body.innerHTML = items.length
  ? items.map(item => `<p>${item.name}</p>`).join("")
  : "<p>No results</p>";

Data Changes पर DOM को कुशलता से Update करना

underlying JSON data में थोड़ा सा भी बदलाव होने पर हर बार शुरू से पूरी list को फिर से बनाना बर्बादी है -- बार-बार update होने वाले data के लिए, targeted updates (सिर्फ प्रभावित खास elements बदलना) या एक lightweight diffing approach एक पूरे teardown-and-rebuild से काफी बेहतर perform करता है।

Note: कभी-कभार होने वाले updates के लिए, एक पूरा rebuild सरल और बिल्कुल ठीक है; targeted updates की ओर तभी optimize करें जब rebuild performance असल में एक measurable समस्या बन जाए।
Warning: बहुत बार-बार updates (जैसे एक live-updating feed) पर full-rebuild rendering हर बार redraw होने पर दिखने वाला flickering या खोई हुई UI state (जैसे scroll position या focus) पैदा कर सकता है।

उदाहरण: Updating the DOM Efficiently on Data Changes

javascript
function updateItem(id, newText) {
  document.querySelector(`[data-id="${id}"]`).textContent = newText; // targeted update, not a full rebuild
}
console.log(typeof updateItem);

एक पूरा Fetch-to-HTML Example

हर चीज़ को मिलाकर: JSON fetch करना, loading और error states संभालना, एक खाली result की जांच करना, और data को safely HTML के रूप में render करना -- यह वह पूरा, असली pipeline है जो किसी modern web page के लगभग किसी भी dynamic, data-driven हिस्से को render करने के पीछे है।

Note: आप जो भी नया data-driven UI section बनाएं उसके लिए इसी पूरी pipeline shape -- fetch, loading state, error handling, empty check, safe render -- को template के रूप में इस्तेमाल करें।
Warning: इस pipeline के किसी भी step को छोड़ना (खासतौर पर error handling या empty-state check) आमतौर पर बाद में एक तुरंत दिखने वाले bug के बजाय एक confusing edge-case bug के रूप में सामने आता है।

उदाहरण: A Complete Fetch-to-HTML Example

javascript
// Assign "<p>Loading...</p>" to `document.body.innerHTML`
// Assign "<p>Loading...</p>" to `document.body.innerHTML`
document.body.innerHTML = "<p>Loading...</p>";
// Define the method `fetch` taking `"items.php"`
// Define the method `fetch` taking `"items.php"`
fetch("items.php")
  // On success, run this with the resolved value as `r`
  // On success, run this with the resolved value as `r`
  .then(r => r.json())
  // On success, run this with the resolved value as `items`
  // On success, run this with the resolved value as `items`
  .then(items => {
    // Assign `items.length` to `document.body.innerHTML`
    // Assign `items.length` to `document.body.innerHTML`
    document.body.innerHTML = items.length
      ? items.map(i => `<p>${i.name}</p>`).join("")
      : "<p>No results</p>";
  })
  .catch(() => document.body.innerHTML = "<p>Failed to load</p>");
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. JSON-derived text को बिना escape किए सीधे innerHTML में insert करना, जो एक XSS vulnerability खोलता है अगर उस data में कभी embedded HTML या script tags वाला user-generated content हो।
  2. हर छोटे data update पर पूरी list को शुरू से rebuild करना, जबकि सिर्फ बदले हुए elements को update करना कहीं ज़्यादा efficient होता।
  3. JSON response से एक empty array को handle करना भूल जाना, एक साफ "no results" message के बजाय एक खाली area छोड़ते हुए।
चैप्टर सारांश
  • JSON data को आमतौर पर उस पर loop करके और हर item के लिए DOM elements या एक HTML string बनाकर HTML में render किया जाता है।
  • कोई भी JSON-derived text जिसमें user-generated content हो सकता है, उसे raw innerHTML के बजाय textContent (या escaped) के ज़रिए insert किया जाना चाहिए, XSS से बचने के लिए।
  • किसी JSON objects की array से HTML string बनाने के लिए Template literals को .map().join("") के साथ combine करना एक common concise pattern है।
ब्राउज़र सपोर्ट

fetched JSON को HTML की तरह render करना सिर्फ standard DOM methods इस्तेमाल करता है, जो हर modern browser में supported हैं।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.