annotate json.py @ 4:d004395e7606

Oops, forgot to add index.js from the parchment svn repo.
author Atul Varma <varmaa@toolness.com>
date Tue, 27 May 2008 23:52:37 -0700
parents 85c3f7bf09d6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1 import string
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2 import types
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
4 ## json.py implements a JSON (http://json.org) reader and writer.
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
5 ## Copyright (C) 2005 Patrick D. Logan
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
6 ## Contact mailto:patrickdlogan@stardecisions.com
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
7 ##
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
8 ## This library is free software; you can redistribute it and/or
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
9 ## modify it under the terms of the GNU Lesser General Public
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
10 ## License as published by the Free Software Foundation; either
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
11 ## version 2.1 of the License, or (at your option) any later version.
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
12 ##
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
13 ## This library is distributed in the hope that it will be useful,
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
14 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
15 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
16 ## Lesser General Public License for more details.
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
17 ##
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
18 ## You should have received a copy of the GNU Lesser General Public
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
19 ## License along with this library; if not, write to the Free Software
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
20 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
21
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
22
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
23 class _StringGenerator(object):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
24 def __init__(self, string):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
25 self.string = string
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
26 self.index = -1
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
27 def peek(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
28 i = self.index + 1
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
29 if i < len(self.string):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
30 return self.string[i]
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
31 else:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
32 return None
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
33 def next(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
34 self.index += 1
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
35 if self.index < len(self.string):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
36 return self.string[self.index]
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
37 else:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
38 raise StopIteration
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
39 def all(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
40 return self.string
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
41
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
42 class WriteException(Exception):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
43 pass
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
44
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
45 class ReadException(Exception):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
46 pass
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
47
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
48 class JsonReader(object):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
49 hex_digits = {'A': 10,'B': 11,'C': 12,'D': 13,'E': 14,'F':15}
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
50 escapes = {'t':'\t','n':'\n','f':'\f','r':'\r','b':'\b'}
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
51
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
52 def read(self, s):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
53 self._generator = _StringGenerator(s)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
54 result = self._read()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
55 return result
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
56
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
57 def _read(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
58 self._eatWhitespace()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
59 peek = self._peek()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
60 if peek is None:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
61 raise ReadException, "Nothing to read: '%s'" % self._generator.all()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
62 if peek == '{':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
63 return self._readObject()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
64 elif peek == '[':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
65 return self._readArray()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
66 elif peek == '"':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
67 return self._readString()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
68 elif peek == '-' or peek.isdigit():
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
69 return self._readNumber()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
70 elif peek == 't':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
71 return self._readTrue()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
72 elif peek == 'f':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
73 return self._readFalse()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
74 elif peek == 'n':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
75 return self._readNull()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
76 elif peek == '/':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
77 self._readComment()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
78 return self._read()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
79 else:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
80 raise ReadException, "Input is not valid JSON: '%s'" % self._generator.all()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
81
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
82 def _readTrue(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
83 self._assertNext('t', "true")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
84 self._assertNext('r', "true")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
85 self._assertNext('u', "true")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
86 self._assertNext('e', "true")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
87 return True
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
88
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
89 def _readFalse(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
90 self._assertNext('f', "false")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
91 self._assertNext('a', "false")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
92 self._assertNext('l', "false")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
93 self._assertNext('s', "false")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
94 self._assertNext('e', "false")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
95 return False
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
96
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
97 def _readNull(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
98 self._assertNext('n', "null")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
99 self._assertNext('u', "null")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
100 self._assertNext('l', "null")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
101 self._assertNext('l', "null")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
102 return None
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
103
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
104 def _assertNext(self, ch, target):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
105 if self._next() != ch:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
106 raise ReadException, "Trying to read %s: '%s'" % (target, self._generator.all())
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
107
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
108 def _readNumber(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
109 isfloat = False
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
110 result = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
111 peek = self._peek()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
112 while peek is not None and (peek.isdigit() or peek == "."):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
113 isfloat = isfloat or peek == "."
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
114 result = result + self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
115 peek = self._peek()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
116 try:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
117 if isfloat:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
118 return float(result)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
119 else:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
120 return int(result)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
121 except ValueError:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
122 raise ReadException, "Not a valid JSON number: '%s'" % result
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
123
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
124 def _readString(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
125 result = ""
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
126 assert self._next() == '"'
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
127 try:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
128 while self._peek() != '"':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
129 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
130 if ch == "\\":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
131 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
132 if ch in 'brnft':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
133 ch = self.escapes[ch]
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
134 elif ch == "u":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
135 ch4096 = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
136 ch256 = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
137 ch16 = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
138 ch1 = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
139 n = 4096 * self._hexDigitToInt(ch4096)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
140 n += 256 * self._hexDigitToInt(ch256)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
141 n += 16 * self._hexDigitToInt(ch16)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
142 n += self._hexDigitToInt(ch1)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
143 ch = unichr(n)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
144 elif ch not in '"/\\':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
145 raise ReadException, "Not a valid escaped JSON character: '%s' in %s" % (ch, self._generator.all())
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
146 result = result + ch
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
147 except StopIteration:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
148 raise ReadException, "Not a valid JSON string: '%s'" % self._generator.all()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
149 assert self._next() == '"'
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
150 return result
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
151
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
152 def _hexDigitToInt(self, ch):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
153 try:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
154 result = self.hex_digits[ch.upper()]
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
155 except KeyError:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
156 try:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
157 result = int(ch)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
158 except ValueError:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
159 raise ReadException, "The character %s is not a hex digit." % ch
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
160 return result
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
161
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
162 def _readComment(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
163 assert self._next() == "/"
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
164 second = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
165 if second == "/":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
166 self._readDoubleSolidusComment()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
167 elif second == '*':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
168 self._readCStyleComment()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
169 else:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
170 raise ReadException, "Not a valid JSON comment: %s" % self._generator.all()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
171
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
172 def _readCStyleComment(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
173 try:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
174 done = False
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
175 while not done:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
176 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
177 done = (ch == "*" and self._peek() == "/")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
178 if not done and ch == "/" and self._peek() == "*":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
179 raise ReadException, "Not a valid JSON comment: %s, '/*' cannot be embedded in the comment." % self._generator.all()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
180 self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
181 except StopIteration:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
182 raise ReadException, "Not a valid JSON comment: %s, expected */" % self._generator.all()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
183
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
184 def _readDoubleSolidusComment(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
185 try:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
186 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
187 while ch != "\r" and ch != "\n":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
188 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
189 except StopIteration:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
190 pass
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
191
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
192 def _readArray(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
193 result = []
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
194 assert self._next() == '['
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
195 done = self._peek() == ']'
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
196 while not done:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
197 item = self._read()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
198 result.append(item)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
199 self._eatWhitespace()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
200 done = self._peek() == ']'
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
201 if not done:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
202 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
203 if ch != ",":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
204 raise ReadException, "Not a valid JSON array: '%s' due to: '%s'" % (self._generator.all(), ch)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
205 assert ']' == self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
206 return result
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
207
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
208 def _readObject(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
209 result = {}
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
210 assert self._next() == '{'
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
211 done = self._peek() == '}'
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
212 while not done:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
213 key = self._read()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
214 if type(key) is not types.StringType:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
215 raise ReadException, "Not a valid JSON object key (should be a string): %s" % key
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
216 self._eatWhitespace()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
217 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
218 if ch != ":":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
219 raise ReadException, "Not a valid JSON object: '%s' due to: '%s'" % (self._generator.all(), ch)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
220 self._eatWhitespace()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
221 val = self._read()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
222 result[key] = val
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
223 self._eatWhitespace()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
224 done = self._peek() == '}'
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
225 if not done:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
226 ch = self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
227 if ch != ",":
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
228 raise ReadException, "Not a valid JSON array: '%s' due to: '%s'" % (self._generator.all(), ch)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
229 assert self._next() == "}"
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
230 return result
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
231
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
232 def _eatWhitespace(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
233 p = self._peek()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
234 while p is not None and p in string.whitespace or p == '/':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
235 if p == '/':
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
236 self._readComment()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
237 else:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
238 self._next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
239 p = self._peek()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
240
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
241 def _peek(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
242 return self._generator.peek()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
243
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
244 def _next(self):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
245 return self._generator.next()
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
246
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
247 class JsonWriter(object):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
248
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
249 def _append(self, s):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
250 self._results.append(s)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
251
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
252 def write(self, obj, escaped_forward_slash=False):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
253 self._escaped_forward_slash = escaped_forward_slash
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
254 self._results = []
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
255 self._write(obj)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
256 return "".join(self._results)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
257
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
258 def _write(self, obj):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
259 ty = type(obj)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
260 if ty is types.DictType:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
261 n = len(obj)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
262 self._append("{")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
263 for k, v in obj.items():
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
264 self._write(k)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
265 self._append(":")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
266 self._write(v)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
267 n = n - 1
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
268 if n > 0:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
269 self._append(",")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
270 self._append("}")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
271 elif ty is types.ListType or ty is types.TupleType:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
272 n = len(obj)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
273 self._append("[")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
274 for item in obj:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
275 self._write(item)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
276 n = n - 1
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
277 if n > 0:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
278 self._append(",")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
279 self._append("]")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
280 elif ty is types.StringType or ty is types.UnicodeType:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
281 self._append('"')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
282 obj = obj.replace('\\', r'\\')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
283 if self._escaped_forward_slash:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
284 obj = obj.replace('/', r'\/')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
285 obj = obj.replace('"', r'\"')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
286 obj = obj.replace('\b', r'\b')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
287 obj = obj.replace('\f', r'\f')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
288 obj = obj.replace('\n', r'\n')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
289 obj = obj.replace('\r', r'\r')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
290 obj = obj.replace('\t', r'\t')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
291 self._append(obj)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
292 self._append('"')
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
293 elif ty is types.IntType or ty is types.LongType:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
294 self._append(str(obj))
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
295 elif ty is types.FloatType:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
296 self._append("%f" % obj)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
297 elif obj is True:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
298 self._append("true")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
299 elif obj is False:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
300 self._append("false")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
301 elif obj is None:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
302 self._append("null")
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
303 else:
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
304 raise WriteException, "Cannot write in JSON: %s" % repr(obj)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
305
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
306 def write(obj, escaped_forward_slash=False):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
307 return JsonWriter().write(obj, escaped_forward_slash)
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
308
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
309 def read(s):
85c3f7bf09d6 Added json.py.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
310 return JsonReader().read(s)