@@ -335,6 +335,31 @@ empty_json_array = mk_tbl("[]", "empty_json_array")
335335-- @see textutils.unserialiseJSON
336336json_null = mk_tbl (" null" , " json_null" )
337337
338+ local serializeJSONString
339+ do
340+ local function hexify (c )
341+ return (" \\ u00%02X" ):format (c :byte ())
342+ end
343+
344+ local map = {
345+ [" \" " ] = " \\\" " ,
346+ [" \\ " ] = " \\\\ " ,
347+ [" \b " ] = " \\ b" ,
348+ [" \f " ] = " \\ f" ,
349+ [" \n " ] = " \\ n" ,
350+ [" \r " ] = " \\ r" ,
351+ [" \t " ] = " \\ t" ,
352+ }
353+ for i = 0 , 0x1f do
354+ local c = string.char (i )
355+ if map [c ] == nil then map [c ] = hexify (c ) end
356+ end
357+
358+ serializeJSONString = function (s )
359+ return (' "%s"' ):format (s :gsub (" [\0 -\x1f \"\\ ]" , map ):gsub (" [\x7f -\xff ]" , hexify ))
360+ end
361+ end
362+
338363local function serializeJSONImpl (t , tTracking , bNBTStyle )
339364 local sType = type (t )
340365 if t == empty_json_array then return " []"
@@ -361,7 +386,7 @@ local function serializeJSONImpl(t, tTracking, bNBTStyle)
361386 if bNBTStyle then
362387 sEntry = tostring (k ) .. " :" .. serializeJSONImpl (v , tTracking , bNBTStyle )
363388 else
364- sEntry = string.format ( " %q " , k ) .. " :" .. serializeJSONImpl (v , tTracking , bNBTStyle )
389+ sEntry = serializeJSONString ( k ) .. " :" .. serializeJSONImpl (v , tTracking , bNBTStyle )
365390 end
366391 if nObjectSize == 0 then
367392 sObjectResult = sObjectResult .. sEntry
@@ -390,7 +415,7 @@ local function serializeJSONImpl(t, tTracking, bNBTStyle)
390415 end
391416
392417 elseif sType == " string" then
393- return string.format ( " %q " , t )
418+ return serializeJSONString ( t )
394419
395420 elseif sType == " number" or sType == " boolean" then
396421 return tostring (t )
0 commit comments