views:

93

answers:

2

I'm working with the last.fm api to get artist images, and I'm getting JSON results where I need to check an '@attr' value. Unfortunately, I can't seem to access this value. The results look something like:

{"image":[{
    "url":"http:\/\/www.last.fm\/music\/Undefined\/+images\/3040021",
    "format":"jpg",
    "sizes":{"size":{"#text":"http:...jpg","name":"original","width":"397","height":"397"},{"#text":"http:...jpg","name":"large","width":"126","height":"126"},]},
    "@attr":{"official":"yes"}}

it's that last value that I can't get to...

any ideas?

I tried ['@attr'] and it didnt' seem to work - only returned undefined.

I'm doing an $.each(obj.image, function(){}) - and within i'm successfully getting this.url, this.format, etc - but i'm not having luck with this['@attr']

+4  A: 

Use the bracket notation member operator:

var value = obj[0]['@attr'];

Then you can access the official property by:

value.official;

Or

obj[0]['@attr']['official'];

Or

obj[0]['@attr'].official;

Edit: As Jonathan pointed out, you have issues with the JSON structure you post, I would recommend you to validate your JSON with a tool like JSONLint.

But I think that you mean something like this:

var obj = {
  "image": [{
    "url": "http:\/\/www.last.fm\/music\/Undefined\/+images\/3040021",
    "format": "jpg",
    "sizes": [{
      "#text": "http:...jpg",
      "name": "original",
      "width": "397",
      "height": "397" 
    },
    {
      "#text": "http:...jpg",
      "name": "large",
      "width": "126",
      "height": "126" 
    } 
    ],
    "@attr": {
      "official": "yes" 
    } 
  }]
};

And with that JSON structure you can iterate it by:

$.each(obj.image, function () {
  alert(this['@attr'].official);
});
CMS
+2  A: 

You have quite a few formatting issues in your snippet. If these are the same in your actual JSON, you're going to have parsing and object-structure conflicts from what you're probably expecting.

{ /* no matching end */
    "images": [ /* no matching end */
        {
            "url":"http:\/\/www.last.fm\/music\/Undefined\/+images\/3040021",
            "format":"jpg",
            "sizes": { /* should this be an array instead? */
                "size": {
                  "#text":"http:...jpg",
                  "name":"original",
                  "width":"397",
                  "height":"397"
                },
                { /* missing key */
                  "#text":"http:...jpg",
                  "name":"large",
                  "width":"126",
                  "height":"126"
                }, /* trailing comma can cause parsing issues */
              ] /* no matching start */
            },
            "@attr": { "official":"yes" }
        }
Jonathan Lonowski
I just cut a bunch of stuff out to make it a little less unwieldy to review - and looks like i could have used more care. Thanks for the heads up
majman