From a92a8d40ce567ecf5b0baacd9a93a94aac9a4a2d Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Tue, 16 Jul 2019 22:42:53 +0200 Subject: 2019-07-16 18:30:00 --- tex/context/base/mkiv/util-jsn.lua | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'tex/context/base/mkiv/util-jsn.lua') diff --git a/tex/context/base/mkiv/util-jsn.lua b/tex/context/base/mkiv/util-jsn.lua index 68c6a712e..8da351897 100644 --- a/tex/context/base/mkiv/util-jsn.lua +++ b/tex/context/base/mkiv/util-jsn.lua @@ -122,11 +122,14 @@ do local f_key_val_num = f_key_val_seq local f_key_val_yes = formatters[ "\n" .. '%w"%s" : true' ] local f_key_val_nop = formatters[ "\n" .. '%w"%s" : false' ] + local f_key_val_null = formatters[ "\n" .. '%w"%s" : null' ] local f_val_num = formatters[ "\n" .. '%w%s' ] local f_val_str = formatters[ "\n" .. '%w"%s"' ] local f_val_yes = formatters[ "\n" .. '%wtrue' ] local f_val_nop = formatters[ "\n" .. '%wfalse' ] + local f_val_null = formatters[ "\n" .. '%wnull' ] + local f_val_empty = formatters[ "\n" .. '%w{ }' ] local f_val_seq = f_val_num -- no empty tables because unknown if table or hash @@ -158,8 +161,10 @@ do n = n + 1 t[n] = '"' elseif tv == "boolean" then n = n + 1 t[n] = v and "true" or "false" - else + elseif v then n = n + 1 t[n] = tostring(v) + else + n = n + 1 t[n] = "null" end end n = n + 1 t[n] = " ]" @@ -217,8 +222,11 @@ do if st then n = n + 1 t[n] = f_val_seq(depth,st) else - tojsonpp(v,k,depth,level+1,0) + tojsonpp(v,nil,depth,level+1,#v) end + else + n = n + 1 + t[n] = f_val_empty(depth) end elseif tv == "boolean" then n = n + 1 @@ -227,6 +235,9 @@ do else t[n] = f_val_nop(depth,v) end + else + n = n + 1 + t[n] = f_val_null(depth) end end elseif next(root) then @@ -244,12 +255,12 @@ do n = n + 1 t[n] = f_key_val_num(depth,k,v) elseif tk == "string" then k = lpegmatch(escaper,k) or k - n = n + 1 t[n] = f_key_val_str(depth,k,v) + n = n + 1 t[n] = f_key_val_num(depth,k,v) end elseif tv == "string" then if tk == "number" then v = lpegmatch(escaper,v) or v - n = n + 1 t[n] = f_key_val_num(depth,k,v) + n = n + 1 t[n] = f_key_val_str(depth,k,v) elseif tk == "string" then k = lpegmatch(escaper,k) or k v = lpegmatch(escaper,v) or v @@ -287,6 +298,15 @@ do t[n] = f_key_val_nop(depth,k) end end + else + if tk == "number" then + n = n + 1 + t[n] = f_key_val_null(depth,k) + elseif tk == "string" then + k = lpegmatch(escaper,k) or k + n = n + 1 + t[n] = f_key_val_null(depth,k) + end end end end @@ -348,6 +368,8 @@ do n = n + 1 ; t[n] = value elseif kind == "boolean" then n = n + 1 ; t[n] = tostring(value) + else + n = n + 1 ; t[n] = "null" end return t, n end @@ -377,10 +399,9 @@ do n = 0 if pretty then tojsonpp(value,name,0,0,#value) --- value = concat(t,"\n",1,n) value = concat(t,"",1,n) else - tojson(value,0) + t, n = tojson(value,0) value = concat(t,"",1,n) end t = nil -- cgit v1.2.3