It is public domain-- from here:
http://www.json.org/json2.js
So I think we are safe hacking up pieces of it and using it.
On Thu, Nov 27, 2008 at 10:14 PM, Michael Clark <[EMAIL PROTECTED]>wrote:
>
> Below is a minimal patch for 1.3 based on a lookup table-based proposal.
> I have tested in firefox and run unit tests on it.
>
> Douglas's version I see is not character by character so it may well
> be faster. Where exactly is it from Arthur? Do you have a link to it?
> (he has lots of links to his various JSON code on his site and I couldn't
> find the particular one).
>
> I see some of his work is public domain but some has a MIT style license.
> I'll let you and William decide on how you want to handle it unless
> you are both happy with the fix below.
>
> This patch can at least be used in the interim for those who need a fix.
>
> Thanks to the original poster for spotting the bug.
>
> --- webapps/jsonrpc/jsonrpc.js (revision 436)
> +++ webapps/jsonrpc/jsonrpc.js (working copy)
> @@ -26,30 +26,32 @@
>
> /* escape a character */
>
> +var ctrlChars = [ "\\u0000", "\\u0001", "\\u0002", "\\u0003",
> + "\\u0004", "\\u0005", "\\u0006", "\\u0007",
> + "\\b", "\\t", "\\n", "\\u000b",
> + "\\f", "\\r", "\\u000e", "\\u000f",
> + "\\u0010", "\\u0011", "\\u0012", "\\u0013",
> + "\\u0014", "\\u0015", "\\u0016", "\\u0017",
> + "\\u0018", "\\u0019", "\\u001a", "\\u001b",
> + "\\u001c", "\\u001d", "\\u001e", "\\u001f" ];
> +
> var escapeJSONChar=function ()
> {
> - var escapeChars = ["\b","\t","\n","\f","\r"];
> + return function(c){
>
> - return function(c){
> // Need to do these first as their ascii values are > 32 (34 & 92)
> if(c == "\"" || c == "\\")
> {
> return "\\"+c;
> }
> - //Otherwise it doesn't need escaping
> - if(c.charCodeAt(0)>=32)
> + // Escape control characters 0 to 31
> + var code = c.charCodeAt(0);
> + if (code < 32)
> {
> - return c;
> + return ctrlChars[code];
> }
> - // Otherwise it is has a code < 32 and may need escaping.
> - for(var i=0;i<escapeChars.length;i++)
> - {
> - if(c==escapeChars[i])
> - {
> - return "\\" + c;
> - }
> - }
> - // it was a character from 0-31 that wasn't one of the escape chars
> + // Otherwise we don't escape (although we need to look into
> + // escaping certain unicode chars here)
> return c;
> };
> }();
>
>
>
> Michael Clark wrote:
> >
> > Arthur Blake wrote:
> >
> >> OK, I see the bug now- thanks for explaining it to me.
> >> (I was looking at the first instance of 'return "\\" + c;' near the
> >> top of the function)
> >>
> >> There may be even more escape characters to worry about..
> >> witness the json2.js (Douglas Crockford's) version:
> >>
> >> var cx =
> /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
> >> escapable =
> /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
> >>
> >> gap,
> >> indent,
> >> meta = { // table of character substitutions
> >> '\b': '\\b',
> >> '\t': '\\t',
> >> '\n': '\\n',
> >>
> >> '\f': '\\f',
> >> '\r': '\\r',
> >> '"' : '\\"',
> >> '\\': '\\\\'
> >> },
> >> rep;
> >>
> >>
> >
> > The table approach will obviously be the fastest but it will not escape
> > these additional unicode chars (the required table would be too big).
> >
> > The original version of the function from json-rpc-java also escaped
> > unicode chars (in fact all above > 127).
> >
> > I think the original bug you fixed was that it was not escaping \ and "
> > from looking at the code (as it was called only for chars < 32 or > 127
> > in the escapeString function)
> >
> > The escaping of unicode chars, although not strictly neccessary, was due
> > to extensive browser testing, it was necessary so that it would work on
> > pages that were not themselves UTF-8 and where the xmlhttprequest
> > implementation didn't allow setting of the charset.
> >
> > IIRC this was for webkit/konq - although this browser bug may be long
> > since fixed.
> >
> > The original test case I used was sending unicode chars from code on a
> > page that itself has a different charset (I believe the unicode test
> > pages is utf8 so we would have to temporarily change it to something
> > else to run a test).
> >
> > Feel free to bring in Douglas's version, i'm okay with that. We just
> > will need to add in copyright and license (include the text of his MIT
> > style license in the client) or get permission from him to redistribute
> > under ASL 2.0.
> >
> >
> >> function quote(string) {
> >>
> >> // If the string contains no control characters, no quote characters,
> and no
> >> // backslash characters, then we can safely slap some quotes around it.
> >> // Otherwise we must also replace the offending characters with safe
> escape
> >>
> >> // sequences.
> >>
> >> escapable.lastIndex = 0;
> >> return escapable.test(string) ?
> >> '"' + string.replace(escapable, function (a) {
> >> var c = meta[a];
> >> return typeof c === 'string' ? c :
> >>
> >> '\\u' + ('0000' +
> a.charCodeAt(0).toString(16)).slice(-4);
> >> }) + '"' :
> >> '"' + string + '"';
> >> }
> >>
> >>
> >> I don't know if it's faster or not- because it uses regular
> expressions...
> >>
> >>
> >> On Thu, Nov 27, 2008 at 7:48 PM, Michael Clark
> >> <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
> >>
> >>
> >> The reason it has 2 bugs is because the routine needs to return
> >> an escaped version of the ctrl char. e.g.
> >>
> >> if (c == "\b") return "\\b";
> >>
> >> Whereas the current array version just returns the original
> >> ctrl char unmodified without any escaping (as the original
> >> poster noted). You would need a second array with the unescaped
> >> versions of each of the control codes to make it work.
> >>
> >> Although for ultimate performance, I have been thinking about it
> >> and instead of the "chained if" I had originally, I propose we
> >> modify your array approach into a 32 element lookup table. It adds
> >> a small amount of bulk to the client - but is the ultimate in
> >> performance. It also fits within the coding convention in a small
> >> amount of space.
> >>
> >> Shall we test and commit something like this?
> >>
> >> var ctrlChars = [ "\u0000", "\u0001", "\u0002", "\u0003",
> >> "\u0004", "\u0005", "\u0006", "\u0007",
> >> "\b", "\t", "\n", "\u000b",
> >> "\f", "\r", "\u000e", "\u000f",
> >> "\u0010", "\u0011", "\u0012", "\u0013",
> >> "\u0014", "\u0015", "\u0016", "\u0017",
> >> "\u0018", "\u0019", "\u001a", "\u001b",
> >> "\u001c", "\u001d", "\u001e", "\u001f" ];
> >>
> >> escapeJSONChar =
> >> function escapeJSONChar(c)
> >> {
> >> var code = c.charCodeAt(0);
> >> if (code >= 32)
> >> {
> >> return c;
> >> }
> >> else
> >> {
> >> return ctrlChars[code];
> >> }
> >> };
> >>
> >>
> >>
> >>
> >> Arthur Blake wrote:
> >> > After I wrote this, I looked into string escaping a little more.
> >> > Technically, we are supposed to escape "control characters".
> >> > What is exactly meant by a "control character" isn't rigidly
> defined
> >> > in the rail diagram, but the reference implementation at:
> >> >
> >> > http://www.json.org/json2.js
> >> >
> >> > defines it. Speaking of the reference implementation- It's
> pretty
> >> > well written. I've long thought we should convert jabsorb to
> >> use this
> >> > at some point.
> >> >
> >> > On Thu, Nov 27, 2008 at 9:13 AM, Arthur Blake
> >> <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> >> > <mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>>
> >> wrote:
> >> >
> >> > Will and I went round and round on this function early on...
> >> >
> >> > The reason for this function is of course to convert a native
> >> > Javascript String into a json version of the String for
> >> transport.
> >> >
> >> > That's why we took out the hex conversion. It's not strictly
> >> > needed as the String is still legal json (and a lot smaller
> and
> >> > more quickly processed) if we only escape characters that
> *must*
> >> > be escaped. (see the rail diagram for string at
> >> http://json.org)
> >> >
> >> > Otherwise doing this hex conversion wastes extra CPU and
> >> makes the
> >> > escaped string a lot larger.
> >> > All we need to do is quickly find characters that *must* be
> >> > escaped for proper json conversion and transfer.
> >> >
> >> > As far as the supposed *bug* found. I don't see how that is a
> >> > bug. Can you explain further?
> >> > The purpose of that code is to escape a double quote char and
> a
> >> > backslash chars if found.
> >> >
> >> > If this is a bug, please explain how you found it, and how
> it's
> >> > hurting you.
> >> >
> >> > As far as the chained if goes: How about using a switch
> >> statement
> >> > instead... wouldn't that be faster than both the chained if
> and
> >> > the array scan?
> >> >
> >> >
> >> >
> >> > On Wed, Nov 26, 2008 at 11:39 PM, Michael Clark
> >> > <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> >> <mailto:[EMAIL PROTECTED]
> >> <mailto:[EMAIL PROTECTED]>>> wrote:
> >> >
> >> >
> >> > Good spotting!
> >> >
> >> > It might be better with the 'chained if' we had in the
> >> earlier
> >> > version
> >> > of that function. e.g.
> >> >
> >> > if (c == "\b") return "\\b";
> >> > else if (c == "\f") return "\\f";
> >> > else if (c == "\n") return "\\n";
> >> > else if (c == "\r") return "\\r";
> >> > else if (c == "\t") return "\\t";
> >> >
> >> > It is most likely faster as there is no need for loop
> local
> >> > variable
> >> > initialization and loop iterator testing, etc.
> >> >
> >> > From looking, the current version does not hex encode
> >> control
> >> > chars
> >> > as required by the JSON spec (bare control chars are not
> >> allowed).
> >> >
> >> > This is based on an older version of the function
> >> (without the
> >> > bug)
> >> > but I have not tested it yet.
> >> >
> >> > escapeJSONChar =
> >> > function escapeJSONChar(c)
> >> > {
> >> > var code = c.charCodeAt(0);
> >> > if (code >= 32) return c;
> >> > else if (c == "\"" || c == "\\") return "\\" + c;
> >> > else if (c == "\b") return "\\b";
> >> > else if (c == "\f") return "\\f";
> >> > else if (c == "\n") return "\\n";
> >> > else if (c == "\r") return "\\r";
> >> > else if (c == "\t") return "\\t";
> >> > var hex = code.toString(16);
> >> > if (hex.length == 1) return "\\u000" + hex;
> >> > else return "\\u00" + hex;
> >> > };
> >> >
> >> > The current jabsorb coding style doesn't allow for concise
> >> > expression of
> >> > chained if, so this would have to be modified before we
> can
> >> > make a patch.
> >> > Let us know if this works for you and I'll translate it
> >> > (personally I
> >> > prefer a more concise coding style). grumble grumble. :)
> >> >
> >> >
> >> > [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> >> <mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
> >> > > var escapeJSONChar=function ()
> >> > > {
> >> > > var escapeChars = ["\b","\t","\n","\f","\r"];
> >> > >
> >> > > return function(c){
> >> > > // Need to do these first as their ascii values
> >> are > 32
> >> > (34 & 92)
> >> > > if(c == "\"" || c == "\\")
> >> > > {
> >> > > return "\\"+c;
> >> > > }
> >> > > //Otherwise it doesn't need escaping
> >> > > if(c.charCodeAt(0)>=32)
> >> > > {
> >> > > return c;
> >> > > }
> >> > > // Otherwise it is has a code < 32 and may need
> >> escaping.
> >> > > for(var i=0;i<escapeChars.length;i++)
> >> > > {
> >> > > if(c==escapeChars[i])
> >> > > {
> >> > > return "\\" + c;
> >> > > }
> >> > > }
> >> > > // it was a character from 0-31 that wasn't one of
> the
> >> > escape
> >> > > chars
> >> > > return c;
> >> > > };
> >> > > }();
> >> > >
> >> > >
> >> > > this function can not return correct quoted char .
> >> > > this line : return "\\" + c; is wrong ,
> >> originalchar returnd
> >> > >
> >> > > >
> >> > >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > >
> >>
> >>
> >>
> >>
> >>
> >>
> >
> >
> > >
> >
>
>
> --~--~---------~--~----~------------~-------~--~----~
> You received this message because you are subscribed to the Google Groups
> "jabsorb-user" group.
> To post to this group, send email to [EMAIL PROTECTED]
> To unsubscribe from this group, send email to
> [EMAIL PROTECTED]<[EMAIL PROTECTED]>
> For more options, visit this group at
> http://groups.google.com/group/jabsorb-user?hl=en
> -~----------~----~----~----~------~----~------~--~---
>
>
_______________________________________________
Jabsorb-dev mailing list
[email protected]
http://lists.jabsorb.org/mailman/listinfo/jabsorb-dev