gjok
gjok

Reputation: 195

How to format json data

I'm new to json and I'm really struggling with my data format.
It needs to have the format: music.genre.album, but just genre.album would also be OK.

Please could someone help with the following structure? I will be using getJSON to iterate through it.

{"music": [{

"Genre_Blues": [{
    "Album": "224",
    "Path": "images/library/",
    "FileName": "AlbumCover224.png"
    },
    {
    "Album": "277",
    "Path": "images/library/",
    "FileName": "AlbumCover277.png"
    },
    {
    "Album": "885",
    "Path": "images/library/",
    "FileName": "AlbumCover885.png"
    }],
"Genre_Jazz": [{
    "Album": "442",
    "Path": "images/library/",
    "FileName": "AlbumCover442.png"
    },
    {
    "Album": "467",
    "Path": "images/library/",
    "FileName": "AlbumCover467.png"
    },
    {
    "Album": "724",
    "Path": "images/library/",
    "FileName": "AlbumCover724.png"
    }],
"Genre_Rock": [{
    "Album": "022",
    "Path": "images/library/",
    "FileName": "AlbumCover022.png"
    },
    {
    "Album": "609",
    "Path": "images/library/",
    "FileName": "AlbumCover609.png"
    },
    {
    "Album": "067",
    "Path": "images/library/",
    "FileName": "AlbumCover067.png"
    }]
  }]

}

Upvotes: 1

Views: 2024

Answers (2)

LetterEh
LetterEh

Reputation: 26696

JSON is just like JavaScript (because it is).

If you want to store multiple things inside of genres (which are what genres are...), then it needs to be an array.

But think about regular JS objects and arrays.

music = {};
music.genre = {};
music.genre.blues = [];
music.genre.blues[0] = {};

Can be written like:

json = { 
    music : {
        genre : {
            blues : [],
            rock  : [],
            soul  : []
        }
    }
}

Then you've got:

json.music.genre.blues[0].album_title;  // "Some Kind of Blue"
json.music.genre.blues[0].album_artist; // "Miles Davis"

You could set a loop to go through your blues, or your rock or whatever...

If you don't want to loop them, then you've got to find some other way to index them, because you can't have an object that has 8 "album" properties. Maybe you could list them by title at that point... ...but that's not all that helpful. You're just getting rid of the array for kicks at that point.

You could also set it up so that genre is an array (which is what you have, now).

So you might have:

music = {
    genre : [
        {
            name : "Blues",
            albums : [
                {
                    title : "Some Kind of Blue",
                    artist : "Miles Davis"
                }
             ]
         },  {
             name : "Soul",
             albums : [
                 {
                     title : "Innervisions",
                     artist : "Stevie Wonder"
                 }, {
                     title : "Talking Book",
                     artist : "Stevie Wonder"
                 }
             ]
         }
     ]
};

Then you've got:

music.genre[0].name;             // "Blues"
music.genre[1].albums[0].artist; // "Stevie Wonder"

The benefit of this is to say:

music.genre.forEach(function (genre) { console.log(genre.name); }); // "Blues", "Soul"

music.genre.forEach(function (genre) {
    console.log("---" + genre.name + "---");
    genre.albums.forEach(function (album) {
        console.log("Title: " + album.title);
        console.log("Artist: " + album.artist);
    });
});

It all comes down to what you want to do with it. You've got the freedom to do anything you want, as long as you know what that is.

Upvotes: 1

SomeKittens
SomeKittens

Reputation: 39512

It's almost there. All you need to do is take out the [ and ]

Upvotes: 0

Related Questions