1
0
mirror of https://github.com/golang/go synced 2024-11-25 05:47:57 -07:00

codereview: handle 'null as missing field' in rietveld json

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/4543046
This commit is contained in:
Russ Cox 2011-05-13 11:17:06 -04:00
parent 3b4a8ff604
commit 404d49154b

View File

@ -2025,25 +2025,35 @@ def JSONGet(ui, path):
try: try:
data = MySend(path, force_auth=False) data = MySend(path, force_auth=False)
typecheck(data, str) typecheck(data, str)
d = coerce_to_utf8(json.loads(data)) d = fix_json(json.loads(data))
except: except:
ui.warn("JSONGet %s: %s\n" % (path, ExceptionDetail())) ui.warn("JSONGet %s: %s\n" % (path, ExceptionDetail()))
return None return None
return d return d
def coerce_to_utf8(x): # Clean up json parser output to match our expectations:
# * all strings are UTF-8-encoded str, not unicode.
# * missing fields are missing, not None,
# so that d.get("foo", defaultvalue) works.
def fix_json(x):
if type(x) in [str, int, float, bool, type(None)]: if type(x) in [str, int, float, bool, type(None)]:
pass pass
elif type(x) is unicode: elif type(x) is unicode:
x = x.encode("utf-8") x = x.encode("utf-8")
elif type(x) is list: elif type(x) is list:
for i in range(len(x)): for i in range(len(x)):
x[i] = coerce_to_utf8(x[i]) x[i] = fix_json(x[i])
elif type(x) is dict: elif type(x) is dict:
todel = []
for k in x: for k in x:
x[k] = coerce_to_utf8(x[k]) if x[k] is None:
todel.append(k)
else: else:
raise util.Abort("unknown type " + str(type(x)) + " in coerce_to_utf8") x[k] = fix_json(x[k])
for k in todel:
del x[k]
else:
raise util.Abort("unknown type " + str(type(x)) + " in fix_json")
if type(x) is str: if type(x) is str:
x = x.replace('\r\n', '\n') x = x.replace('\r\n', '\n')
return x return x