Skip to main content

Bug Tracker

Side navigation

#8320 closed bug (invalid)

Opened February 18, 2011 06:29PM UTC

Closed February 18, 2011 07:09PM UTC

Last modified March 14, 2012 07:40PM UTC

parseJSON fails if data contains \\' (WCF Data Services escapes single quotes)

Reported by: pitus Owned by:
Priority: low Milestone: 1.next
Component: misc Version: 1.5
Keywords: Cc:
Blocked by: Blocking:
Description

When calling jQuery.getJSON("Service.svc/Table"...) on Microsoft WCF Data Service (.NET 3.5) which returns data from Entities that contain single quotes, these quotes are escaped using a backslash, as in

"Sample \\'1\\'"
for example. This fails with a parsererror

See http://jsfiddle.net/pJgyu/6103/ or try the following:

try
{
    var o = $.parseJSON("{\\"Text\\":\\"Sample \\\\'1\\\\'\\"}");
    alert( o.Text );
}
catch( e )
{
    alert( e );
}

I have managed to fix this by adding a single quote into the escaping portion of the logic from json2.js

if ( /^[\\],:{}\\s]*$/.test(data.replace(/\\\\(?:['"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\\\\\\n\\r]*"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, "]")
.replace(/(?:^|:|,)(?:\\s*\\[)+/g, "")) ) {

Note the change from

(/\\\\(?:["\\\\\\/bfnrt]...
to
(/\\\\(?:['"\\\\\\/bfnrt]...

As far as I know, this problem is with any version of jQuery.

Attachments (0)
Change History (5)

Changed February 18, 2011 07:09PM UTC by jitter comment:1

_comment0: Thanks for taking the time to contribute to the jQuery project by writing a bug report. \ \ This isn't a bug. Escaping single quotes inside a JSON string is neither needed or is it a valid thing to do. \ \ You can easily verify that by: \ - trying `{"Text":"Sample \\'1\\'"}` on http://www.jsonlint.com \ - cechking the definition of JSON Strings at http://json.org/ where all characters are listed that need to be escaped with a backslash1298056205356371
component: unfiledmisc
priority: undecidedlow
resolution: → invalid
status: newclosed

Thanks for taking the time to contribute to the jQuery project by writing a bug report.

This isn't a bug. Escaping single quotes inside a JSON string is neither needed or is it a valid thing to do.

You can easily verify that by:

Changed February 18, 2011 07:17PM UTC by pitus comment:2

Someone else had the same issue: http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/49136617-0a2a-4963-9e4e-6181c60ec840?prof=required

In version 1.5 this can be fixed in line 56 of jQuery-1.5.js

	rvalidescape = /\\\\(?:['"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,

Perhaps this is NOT a bug in jQuery, but that's how Microsoft escapes single quotes so this info could prove to be useful to many developers using WFC Services.

Changed February 18, 2011 09:56PM UTC by jitter comment:3

_comment0: Replying to [comment:2 pitus]: \ > Someone else had the same issue: [http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/49136617-0a2a-4963-9e4e-6181c60ec840?prof=required] \ > \ > In version 1.5 this can be fixed in line 56 of jQuery-1.5.js \ > {{{ \ > rvalidescape = /\\\\(?:['"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, \ > }}} \ > \ > Perhaps this is NOT a bug in jQuery, but that's how Microsoft escapes single quotes so this info could prove to be useful to many developers using WFC Services. \ Are you really considering using a modified version of jQuery on a production side? That's not a good idea and will cause problems later on (upgrading, maintenance, unexpected behaviors, ...) \ \ Instead I suggest you file this as a bug to the Microsoft WCF Data Service Team. And in the mean time use a new functionality available in jQuery 1.5 to workaround this problem. Use a custom json converter. \ \ {{{ \ $.ajaxSetup({ \ // use custom converter to handle invalid json data \ // returned by WCF Data Service \ // fixes invalid escaped single quotes (\\') in json data \ // e.g. { "foo": "bar\\'tender" } --> { "foo": "bar'tender" } \ converters: { \ "text json": function( textValue ) { \ return jQuery.parseJSON( textValue.replace(/([^\\\\])?\\\\'/, "$1'") ); \ } \ } \ }); \ }}}1298066823864713

Replying to [comment:2 pitus]:

Someone else had the same issue: http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/49136617-0a2a-4963-9e4e-6181c60ec840?prof=required In version 1.5 this can be fixed in line 56 of jQuery-1.5.js
> 	rvalidescape = /\\\\(?:['"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
> 
Perhaps this is NOT a bug in jQuery, but that's how Microsoft escapes single quotes so this info could prove to be useful to many developers using WFC Services.

Are you really considering using a modified version of jQuery on a production side? That's not a good idea and will cause problems later on (upgrading, maintenance, unexpected behaviors, ...)

Instead I suggest you file this as a bug to the Microsoft WCF Data Service Team. And in the mean time use a new functionality available in jQuery 1.5 to workaround this problem. Use a custom json converter.

$.ajaxSetup({
    // use custom converter to handle invalid json data
    // returned by WCF Data Service
    // fixes invalid escaped single quotes (\\') in json data
    // e.g. { "foo": "bar\\'tender" } --> { "foo": "bar'tender" }
    converters: {
        "text json": function( textValue ) {
            return jQuery.parseJSON( textValue.replace(/(^|[^\\\\])\\\\'/g, "$1'") );
        }
    }
});

Changed February 19, 2011 02:39AM UTC by pitus comment:4

Thanks for the converters example. I ended up using a slightly different version of it, one that also handles Microsoft Dates. Note that it doesn't handle Time Zone suffixes properly, as in Date(#-005)

$.ajaxSetup({
    // use custom converter to handle invalid json data returned by WCF Data Service
    // ignores invalid escaped single quotes (\\') in json data
    //     e.g. { "foo": "bar\\'tender" } --> { "foo": "bar'tender" }
    // also converts Microsoft Dates into actual Date objects
    //     e.g. { "\\/Date(###)\\/" } --> { new Date(###) }
    converters: {
        "text json": function (textValue)
        {
            return (new Function("return " + textValue
                .replace(/"\\\\\\/Date\\((-?\\d*)\\)\\\\\\/"/g, "new Date($1)")
            ))();
        }
    }
});

Changed April 16, 2011 05:44PM UTC by Gaute Løken <mithon81@hotmail.com> comment:5

That date converter should not be applied to "text json" since it will cause any resulting json results to be parsed into a Date or string or throw an exception rather than a nested object, which is the job of mime type "application/json" aka "text json".

What you're doing here is fine and all, but you might want to apply them to "* text" instead, and control the mime type of your response, or specify it with your call to $.ajax. Finally I'd suggest you add ^ and $ to your regex to avoid it throwing errors when your textValue contains a date as well as something else.

For a more involved discussion of how to deal with dates, feel free to have a look at this ticket: http://bugs.jquery.com/ticket/8671