here's the JSON file
[{
"Pizza": [
{
"title": "cheese lovers",
"photo": "./cl.jpg"
},
{
"title": "checken ranch",
"photo": "./cr.jpg"
}
],
"Pasta": [
{
"title": "spaghetti",
"photo": "./sp.jpg"
},
{
"title": "lasagna",
"photo": "./la.jpg"
}
],
"Asian": [
{
"title": "sushi",
"photo": "sushi.jpg"
},
{
"title": "chicken sweet & sour",
"photo": "css.jpg"
}
],
"Dessert": [
{
"title": "cheesecake",
"photo": "cc.jpg"
},
{
"title": "ice ceam",
"photo": "ic.jpg"
}
],
"Drinks": [
{
"title": "tea",
"photo": "tea.jpg"
},
{
"title": "orange juice",
"photo": "oj.jpg"
}
]
} ]
What I wanna do is using the fetch API the categories would be listed in a menu, and the inside content would be shown in other HTML elements. When I use a normal fetch API function I can see everything in the console, but when I try to render the JSON data it only shows [object object], any deeper levels give me errors. So is there a different way I can fetch the data or the JSON file itself needs editing?
CodePudding user response:
You cannot render an object directly into HTML, for example if you want to render your fetched API into HTML Lists you can do it like this:
const a = [{
"Pizza": [{
"title": "cheese lovers",
"photo": "./cl.jpg"
},
{
"title": "checken ranch",
"photo": "./cr.jpg"
}
],
"Pasta": [{
"title": "spaghetti",
"photo": "./sp.jpg"
},
{
"title": "lasagna",
"photo": "./la.jpg"
}
],
"Asian": [{
"title": "sushi",
"photo": "sushi.jpg"
},
{
"title": "chicken sweet & sour",
"photo": "css.jpg"
}
],
"Dessert": [{
"title": "cheesecake",
"photo": "cc.jpg"
},
{
"title": "ice ceam",
"photo": "ic.jpg"
}
],
"Drinks": [{
"title": "tea",
"photo": "tea.jpg"
},
{
"title": "orange juice",
"photo": "oj.jpg"
}
]
}];
list = document.getElementById("ul"); //get access to your ul tag
for (const [key, value] of Object.entries(a[0])) { //a[0] since you have the first layer is an array with one item
let li = document.createElement("li"); // you map through your object and create an li tag
li.innerText = key; // add the key text to the li ("Pizza", "Pasta", "Asian" ...)
list.appendChild(li); // add the list item to the list
let smallerList = document.createElement("ul"); //create another list (nested list)
li.appendChild(smallerList); // add the nested list under the first list item
value.forEach((element) => { //since its an array we map through it using array.forEach which means element is {"title": some data, "photo": some data}
for (const [key2, value2] of Object.entries(element)) { //so we find that it is another object so we map through it
let smallerLi = document.createElement("li"); // create another list item
smallerLi.innerText = `${key2}: ${value2}`; // set the text of the list item to for example ("title": "orange juice")
smallerList.appendChild(smallerLi); //add the smaller list item to the nested list
}
});
}
<!DOCTYPE html>
<html>
<body>
<ul id="ul">
</ul>
</body>
</html>
CodePudding user response:
You cannot console.log an object directly. One quick solution to debug (I assume you're trying to debug using console.log) is this
console.log(JSON.stringify(data).
Another options for quick inspection are console.table(data) for table formatting or console.dir(data) to see all properties of your object.
