@@ -335,6 +335,31 @@ empty_json_array = mk_tbl("[]", "empty_json_array")
335
335
-- @see textutils.unserialiseJSON
336
336
json_null = mk_tbl (" null" , " json_null" )
337
337
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
+
338
363
local function serializeJSONImpl (t , tTracking , bNBTStyle )
339
364
local sType = type (t )
340
365
if t == empty_json_array then return " []"
@@ -361,7 +386,7 @@ local function serializeJSONImpl(t, tTracking, bNBTStyle)
361
386
if bNBTStyle then
362
387
sEntry = tostring (k ) .. " :" .. serializeJSONImpl (v , tTracking , bNBTStyle )
363
388
else
364
- sEntry = string.format ( " %q " , k ) .. " :" .. serializeJSONImpl (v , tTracking , bNBTStyle )
389
+ sEntry = serializeJSONString ( k ) .. " :" .. serializeJSONImpl (v , tTracking , bNBTStyle )
365
390
end
366
391
if nObjectSize == 0 then
367
392
sObjectResult = sObjectResult .. sEntry
@@ -390,7 +415,7 @@ local function serializeJSONImpl(t, tTracking, bNBTStyle)
390
415
end
391
416
392
417
elseif sType == " string" then
393
- return string.format ( " %q " , t )
418
+ return serializeJSONString ( t )
394
419
395
420
elseif sType == " number" or sType == " boolean" then
396
421
return tostring (t )
0 commit comments