user508096
user508096

Reputation: 51

Working with a JSON file and Javascript

On return of a JSON file I can't seem to be able to detect how many results are returned. The problem seems to be with the JSON file returning a diffrent number of items each time. At times it will return 1 item, then at other it will return more than 1. You see, I'm trying to get the very first result from the JSON file so I can display it. Now, If change the code everytime I know the number that will be returned, the following two bits of code work.. Artists.id; and Artists.id[0];, but I can't seem to make them work together, at the momment..

If 1 result is returned, Artists.id; will successfully bring back the artist ID;
If more than 1 result is returned Artists.id; will return "undefined".

So I need to change it to Artists.id[0]; if the JSON file returns more than 1 item. However when I change it to this, if the JSON conatins 1 item, it will return "undefined".

It seems I need some code to tell me if the returned array has 1 or more items. I've tried arr.length but that doesn't seem to be working (perhaps i miss-coded it). I also tried if(arr===undefined) and that failed to work too. The code below is what I have come up with, using the artistzero, but it is not working. Anyone has any advice? or a reason why the code below would not work?

Current Code:

    $.ajax(
    {
        type: "GET",
        url: id_url,
        dataType: "jsonp",
        success: function (responseData, textStatus, XMLHttpRequest)
        {
            if (responseData.Artists.Artist)
            {
                var Artists = responseData.Artists.Artist;
                var artistzero = Artists.length;

                if (artistzero >= 2)
                {
                    // if more than one result is returned
                    var artisttype = Artists.id[0];
                }
                if (artistzero <= 1)
                {
                    // if one result is returned
                    var artisttype = Artists.id;
                }
            }
            else
            {
                $('body').append('No results');
            }
        }
    });

Sample JSON with 1 result:

{"Artists":{"total":"1","count":"1","start":"1","errorCount":"0","Artist":{"id":"33291476","flags":"123010","catzillaID":"0","website":"","name":"Jamie T","rating":"-1","ItemInfo":{"Relevancy":{"index":"1316"}},"hotzillaID":"1809709440","url":"http://web.com/jamie-t/","trackCount":"96"}}}

Sample JSON with more than one result:

{"Artists":{"total":"1087","count":"3","start":"1","errorCount":"0","Artist":[{"id":"256212","flags":"123523","catzillaID":"1927205428","website":"http://www.bobmarley.com/","name":"Bob Marley","rating":"-1","ItemInfo":{"Relevancy":{"index":"718"}},"hotzillaID":"1802045595","url":"http://web.com/bob-marley/","trackCount":"12706"},{"id":"312874","flags":"124611","catzillaID":"1927580000","website":"http://www.bobdylan.com/","name":"Bob Dylan","rating":"-1","ItemInfo":{"Relevancy":{"index":"694"}},"hotzillaID":"1800021697","url":"http://web.com/bob-dylan/","trackCount":"4987"},{"id":"268472","flags":"41603","catzillaID":"1927193413","website":"","name":"Bob Wills","rating":"-1","ItemInfo":{"Relevancy":{"index":"644"}},"hotzillaID":"1800264434","url":"http://web.com/bob-wills/","trackCount":"2364"}]}}

Upvotes: 0

Views: 197

Answers (4)

rbhro
rbhro

Reputation: 208

However, if more than 1 result is returned Artists.id; will return "undefined". So I need to change it to this: Artists.id[0];

this cannot be Artists.id should be "object" not undefined if Artists.id[0] exists. Maybe it is as stated Artists[0].id ? and if so you could test typeof(Artists) == typeof([])

Upvotes: 0

NimChimpsky
NimChimpsky

Reputation: 47290

 for(var propertyname in responseData){
       //will loop through the different elements in your json array
      alert(responseData[propertyName]); //will output the valueof each element
}

Upvotes: 1

Andrzej Doyle
Andrzej Doyle

Reputation: 103787

You're right that this is problematic, and to be honest it sounds like the "other end" that's sending you the JSON is being inconsistent.

The problem is that when there are multiple items they're sending you an array for the id property, and when there's a single item they're just sending you a simple value (e.g. an integer). Ideally, when there is a single item you should be sent a single-item array - this would let you use the same array-based parsing code every time.

If you can't convince them to change what they're sending you, though, then the best bet is simply to do what you're currently doing; see if Artists.id is defined, use it if so, else fall back to accessing id as an array.

Upvotes: 0

Nick Craver
Nick Craver

Reputation: 630389

You need to access the first artist before grabbing the id (since it's an array) like this:

var artisttype = Artists[0].id;

It would be better if you could change the JSON to always return an Array, even with one result...unfortunately some platforms don't do this, for reasons beyond my comprehension.

Upvotes: 1

Related Questions