195 def json(obj): |
195 def json(obj): |
196 if obj is None or obj is False or obj is True: |
196 if obj is None or obj is False or obj is True: |
197 return {None: 'null', False: 'false', True: 'true'}[obj] |
197 return {None: 'null', False: 'false', True: 'true'}[obj] |
198 elif isinstance(obj, int) or isinstance(obj, float): |
198 elif isinstance(obj, int) or isinstance(obj, float): |
199 return str(obj) |
199 return str(obj) |
200 elif isinstance(obj, encoding.localstr): |
|
201 u = encoding.fromlocal(obj).decode('utf-8') # can round-trip |
|
202 return '"%s"' % jsonescape(u) |
|
203 elif isinstance(obj, str): |
200 elif isinstance(obj, str): |
204 # no encoding.fromlocal() because it may abort if obj can't be decoded |
201 return '"%s"' % encoding.jsonescape(obj, paranoid=True) |
205 u = unicode(obj, encoding.encoding, 'replace') |
|
206 return '"%s"' % jsonescape(u) |
|
207 elif isinstance(obj, unicode): |
|
208 return '"%s"' % jsonescape(obj) |
|
209 elif util.safehasattr(obj, 'keys'): |
202 elif util.safehasattr(obj, 'keys'): |
210 out = [] |
203 out = [] |
211 for k, v in sorted(obj.iteritems()): |
204 for k, v in sorted(obj.iteritems()): |
212 s = '%s: %s' % (json(k), json(v)) |
205 s = '%s: %s' % (json(k), json(v)) |
213 out.append(s) |
206 out.append(s) |