vote up 2 vote down
star
1

What the best way to report a syntax error when I'm loading a JSON feed with jQuery? I can establish the error reporting settings like this:

error: function(xhr){
    alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
}

however this function doesn't fire when the URL I've called loads a valid page (albeit not one with a JSON object in it). Futhermore, I can't check the data that it does return because (according to Firebug at least) jQuery.getJSON breaks at the syntax error before it passes the object to the function that executes it.

The reason I'd like to report errors is because this is my way of checking whether the user has supplied a URL that will produce a valid JSON feed.

Here's a related answer that requires control over what the server will respond with. Here's the syntax error that Firebug gives me The syntax error Firebug gives me

Any ideas? Thanks

flag
What version of jQuery? – Kevin Hakanson Jun 23 at 3:14
1.2.8 that's packaged with WordPress 2.8 – Daniel Bachhuber Jun 23 at 3:58
add comment

3 Answers

vote up 2 vote down

You can bind a function to global ajaxerror events

$(document).ajaxError(function(event, request, ajaxOptions, thrownError){
  if ( 4==request.readyState) { // failed after data has received
    alert(ajaxOptions['url'] + " did not return valid json data");
  }
  else {
    alert("something else wnet wrong");
  }
});
or use $.ajax() instead of $.getJSON()
function foo() {
  // $.getJSON("http://localhost/test.txt", function(data){});
  $.ajax({
    type: "GET",
    url: "http://localhost/test.txt",
    success: function (data, textStatus) {
      alert("succuess");
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert("request failed: " + textStatus);
    },
    dataType: "json"
  });
}

edit: But you might want to keep in mind that both ajax(dataType:"json") and getJSON() (which simply invokes .ajax(dataType:"json") boil down to data = window["eval"]("(" + data + ")") ...this might not be what you want if you don't know what (arbitrary) data your script requests. And this could explain why firebug is catching a syntax error when you feed it an html document instead of json data.
In that case better request dataType:"string" und run the data through a fully fledged json parser lib.

link|flag
Thanks for the detailed code response, VolkerK. I think both of these examples would work if the URL itself was returning an error of some sort. I tried including your first example. The issue, however, is that the URL loads fine but it isn't a valid JSON object. When jQuery tries to parse it, it throws a syntax error on the data provided. – Daniel Bachhuber Jun 23 at 4:13
1 
Both code snippets were able to tell a mere connection problem from data format trouble when I tested it. I'd prefer the .ajax() approach. Then textStatus is =="parserror" if the data isn't JSON. – VolkerK Jun 23 at 4:19
Odd, still no dice. I changed my process from $.getJSON to $.ajax, but Firebug still throws the syntax error instead of any alert messages. Thanks for the help in any regard. – Daniel Bachhuber Jun 23 at 4:31
I'm testing with jquery 1.3.2, but anyway: see my last post-edit... – VolkerK Jun 23 at 4:54
Ah, good point. I was thinking that I might have to include an intermediate step where I can check the URL data myself. I'll try that out in the morning. – Daniel Bachhuber Jun 23 at 4:58
add / show 1 more comment
vote up 0 vote down

Call the URL or the XHR request directly in your browser's address bar, do a view-source and paste the result into and IDE that understands JavaScript. You'll probably spot a misplaced quote or something.

At least you'll be able to remove chunks of it until you find the offending syntax if nothing else.

link|flag
So what it's actually doing in the instances where it's throwing syntax errors is loading a normal webpage with DOCTYPE and all, and then trying to parse that. It throws the syntax error because it thinks I'm trying to feed it a JSON feed, when really I'd rather have it return false or an error message. – Daniel Bachhuber Jun 23 at 4:01
add comment
vote up 0 vote down

Adding to Diodeus' answer, paste your potentially offending JSON into here this tool: http://jsonformatter.curiousconcept.com/

If you have firebug, you might even be able to hack together a way to use the site a service programmatically, though that may be frowned upon.

link|flag
add comment

Your Answer

Get an OpenID
or

Not the answer you're looking for? Browse other questions tagged or ask your own question.