mirror of
https://github.com/golang/go
synced 2024-11-21 20:34:40 -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:
parent
3b4a8ff604
commit
404d49154b
@ -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:
|
||||||
|
x[k] = fix_json(x[k])
|
||||||
|
for k in todel:
|
||||||
|
del x[k]
|
||||||
else:
|
else:
|
||||||
raise util.Abort("unknown type " + str(type(x)) + " in coerce_to_utf8")
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user