JSON decoding

Brendan Eich brendan at mozilla.org
Fri Oct 20 12:26:26 PDT 2006

On Oct 11, 2006, at 8:06 PM, Brendan Eich wrote:

> On Oct 11, 2006, at 3:06 PM, Robert Sayre wrote:
>> I'm pretty sure the group accepted some form of Crockford's parseJSON
>> proposal, but I think it would be handy to add something analogous to
>> simplejson's object_hook argument. One weakness JSON has is  
>> annotating
>> literals (like strings with custom attributes), and this facility can
>> make that smoother.
>> <http://svn.red-bean.com/bob/simplejson/trunk/docs/module- 
>> simplejson.html#load>
>> See "Specializing JSON object decoding" above as well.
> Thanks, the wiki will be re-exported after the next face-to-face  
> TG1 meeting (which is the end of next week).  We should have  
> finalized the JSON APIs by then.  We were already considering an  
> optional filter funarg, but Bob's object_hook is more powerful.   
> I've added a comment to the wiki with that link.

Sneak preview (wiki re-export coming soon) of Doug Crockford's latest  
rev of the proposal:

JSON encoding and decoding

The following built-in functions facilitate handling JSON data, as  
specified in Douglas Crockford's RFC 4627.

     * Object.prototype.toJSONString( filter , pretty )

Returns a String containing the JSON representation of an object,  
array, date, string, number, boolean, or null . The proto link is not  
used when finding members. A Date object is serialized as an ISO date  
string in double quotes. An Array object is serialized as a sequence  
of comma separated values wrapped in square brackets. Otherwise, an  
object is serialized as a a sequenced of comma separated pairs  
wrapped in curly braces. A string is serialized as a quoted string  
with backslash escapement. A finite number is serialized by toString.  
true , false , and null are encoded an unquoted strings. See http:// 

An encodingError will be thrown if the encoder reache a value which

     * cannot be encoded as valid JSON (such as a function,  
undefined, and NaN) OR
     * represents a cycle (as happens when an object has a property  
that refers to itself)

Recurring objects which do not cause cycles are allowed, but will  
produce a complete text for each occurrence.

A filter is an optional function which takes two parameters: a name  
and a value. The function will be called for each candidate pair in  
each object being serialized. If the function returns true, then the  
pair will be included. If the function returns false, then the pair  
will be excluded. If the function returns any other value, or if it  
throws, then an encodingError exception is thrown.

If the pretty parameter is true, then linefeeds are inserted after  
each { , [ , and , and before } and ] , and multiples of 4 spaces are  
inserted to indicate the level of nesting, and one space will be  
inserted after : . Otherwise, no whitespace is inserted between the  

     * String.prototype.parseJSON( hook )

Returns the value represented by the string. A syntaxError is thrown  
if the string was not a strict JSON text.

The optional hook function will be called for each object value  
found. It is passed each object. Its return value will be used  
instead of the object in the final structure.

I like this proposal a lot; it avoids too many bells and whistles,  
and captures the desired (different) hooks for encoding and decoding,  
as well as pretty-encoding.  Comments?


More information about the Es4-discuss mailing list