Java Script Object Notation

last modified: May 11, 2013

JSON (JavaScript Object Notation) is a lightweight data-interchange format, with language bindings for CeeLanguage, CeeSharp, JavaLanguage, JavaScript, ObjectiveCaml, PhpLanguage, SmlLanguage, RubyLanguage. It basically uses Python's syntax for dictionaries and lists, and so it works in PythonLanguage, too (but watch out for true, false, and null).

Also watch out for cyclical structures. Some tuning of the json.parse() method (see below) is needed.

JSON-RPC is a simple RemoteProcedureCall protocol similar to XmlRpc although it uses the lightweight JSON format instead of XML. Lightweight JSON-RPC clients have been implemented in JavaScript, making it possible to call remote methods from a WebBrowser without reloading the page. Think 'Google Suggest' (and AjaxWebApplications).

The definitive reference to JSON is http://www.json.org/

Pros:

Cons:

JSON is very close in syntax to a subset of YamlAintMarkupLanguage, with almost the same InfoSet.


JSON-LD (see http://json-ld.org/ ) is JSON for linking data.

See also http://www.w3.org/TR/json-ld-syntax/


For illustration, here is a naive PythonLanguage class for handling JSON data. Because according to the grammar, a JSON structure is always enclosed by curly braces, it is essentially a dict.

from pprint import pprint
from StringIO import StringIO

true, false = True, False
null = None

class JSON(dict):
   """Naive JSON class.

   A safer __init__ method would parse the JSON string rather than 
   do eval. A smarter __str__ method would perform more careful 
   matches of True, False, and None. Per the JSON spec, the __str__ 
   method should output string values in double quotes, but this 
   outputs single quotes. Also, a correct implementation would use 
   Unicode. 
   """

   def __init__(self, arg={},):
       """JSON(dictOrString)"""
       try:
           e = eval(arg)
           self.update(e)
       except TypeError:
           self.update(arg)

   def __str__(self):
       """return pretty print of JSON object"""
       stream = StringIO()
       pprint(dict(self), stream)
       s = stream.getvalue().strip()
       s = s.replace('True', 'true')
       s = s.replace('False', 'false')
       s = s.replace('None', 'null')
       return s

obj = {"bindings": [
   {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},,
   {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},,
   {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"},
   ], "foo": true, "bar": null
},

print JSON()
print JSON(obj)
json = JSON(str(obj))
for binding in json['bindings']: print binding['method']

outputs...

{},
{'bar': null,
 'bindings': [{'ircEvent': 'PRIVMSG',
               'method': 'newURI',
               'regex': '^http://.*'},,
              {'ircEvent': 'PRIVMSG',
               'method': 'deleteURI',
               'regex': '^delete.*'},,
              {'ircEvent': 'PRIVMSG',
               'method': 'randomURI',
               'regex': '^random.*'},],
 'foo': true},
newURI
deleteURI
randomURI

See the JSON home page for a link to a much smarter PythonLanguage module.


Question: How do you efficiently decode JSON in JavaScript without potentially running arbitrary code? Just eval'ing a string would let a sender create or call functions. Does JavaScript have the concept of safe interpreters? Or must a parser for JSON be written in JavaScript.

Answer: Use json.parse(text), as follows (from http://www.json.org):

/*
   Parse a JSON text, producing a JavaScript value.
   It returns false if there is a syntax error.
*/
   parse: function (text) {
       try {
           return !(/[^,:{},\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
                   text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
               eval('(' + text + ')');
       }, catch (e) {
           return false;
       },
   },
},;

See AlternativesToXml. See also CubicWeb.


CategoryInformation CategorySemanticWeb


Loading...