views:

249

answers:

1

My jQuery ajax call is failing with an undefined error. My js code looks like this:

$.ajax({
   type: "POST",
   url: "Data/RealTime.ashx",
   data: "{}",
   contentType: "application/json; charset=utf-8",
   dataType: "json",
   timeout: 15000,
   dataFilter: function(data, type) {
       alert("RAW DATA: " + data + ", TYPE: "+ type);
       return data;
   },
   error: function(xhr, textStatus, errorThrown) {
       alert("FAIL: " + xhr + " " + textStatus + " " + errorThrown);
   },
   success: function(data) {
       alert("SUCCESS");
   }
});

My ajax source is a generic ASP.NET handler:

[WebService(Namespace = "http://my.website.com")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class RealTime : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json";
        context.Response.Write("{ data: [1,2,3] }");
        context.Response.End();
    }

    public bool IsReusable
    { get { return false; } }
}

Now, if I return an empty object ("{ }") in my handler, the call will succeed. But when I return any other JSON object, the call fails.

The dataFilter handler shows that I am receiving a correct object. Firebug shows the response as expected, and the JSON tab shows that the object is parsed correctly.

So what could be the cause?

[Edit] I should have actually written "when I return any invalid JSON object, the call fails"! :D

+1  A: 

You need valid JSON! :)

Change this line:

context.Response.Write("{ data: [1,2,3] }");

To this:

context.Response.Write("{ \"data\": [1,2,3] }");

jQuery 1.4+ doesn't tolerate invalid JSON like it used to (fails silently/in weird ways), so just add the double quotes and you're all set. For a handy tool to test JSON validity, checkout JSONLint: http://www.jsonlint.com/

Nick Craver
Yes, last time I used this stuff was with jQuery 1.3.2, and it worked. It's funny it never occurred to me to try the old project and see what happens. :)
Groo
Frameworks have gotten more strict ...
Pointy
@Groo - Ah yeah that's the most common problem with these, but as @Pointy says they're more strict...but for a reason, it's so if the native `JSON.parse` function is present, we can use the browser's much faster implementation to do the work, win for everybody once all browsers support it property, jQuery is just wrapping it until then :)
Nick Craver