value-string-escape-ascii.js (1757B)
1 // Copyright (c) 2018 Ecma International. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 4 /*--- 5 esid: sec-quotejsonstring 6 description: > 7 JSON.stringify property names and values containing ASCII 8 characters that require escaping 9 ---*/ 10 11 var char_to_json = { 12 '"': '\\"', 13 "\\": "\\\\", 14 "\x00": "\\u0000", 15 "\x01": "\\u0001", 16 "\x02": "\\u0002", 17 "\x03": "\\u0003", 18 "\x04": "\\u0004", 19 "\x05": "\\u0005", 20 "\x06": "\\u0006", 21 "\x07": "\\u0007", 22 "\x08": "\\b", 23 "\x09": "\\t", 24 "\x0A": "\\n", 25 "\x0B": "\\u000b", 26 "\x0C": "\\f", 27 "\x0D": "\\r", 28 "\x0E": "\\u000e", 29 "\x0F": "\\u000f", 30 "\x10": "\\u0010", 31 "\x11": "\\u0011", 32 "\x12": "\\u0012", 33 "\x13": "\\u0013", 34 "\x14": "\\u0014", 35 "\x15": "\\u0015", 36 "\x16": "\\u0016", 37 "\x17": "\\u0017", 38 "\x18": "\\u0018", 39 "\x19": "\\u0019", 40 "\x1A": "\\u001a", 41 "\x1B": "\\u001b", 42 "\x1C": "\\u001c", 43 "\x1D": "\\u001d", 44 "\x1E": "\\u001e", 45 "\x1F": "\\u001f" 46 } 47 48 var chars = Object.keys(char_to_json).join(""); 49 var chars_reversed = Object.keys(char_to_json).reverse().join(""); 50 var jsonChars = Object.values(char_to_json).join(""); 51 var jsonChars_reversed = Object.values(char_to_json).reverse().join(""); 52 var json = JSON.stringify({ 53 ["name" + chars + chars_reversed]: chars_reversed + chars + "value" 54 }); 55 56 for (var char in char_to_json) { 57 var count = json.split(char_to_json[char]).length - 1; 58 assert.sameValue(count, 4, 59 "Every ASCII 0x" + char.charCodeAt(0).toString(16) + " serializes to " + char_to_json[char]); 60 } 61 62 assert.sameValue( 63 json, 64 `{"${"name" + jsonChars + jsonChars_reversed}":"${jsonChars_reversed + jsonChars + "value"}"}`, 65 "JSON.stringify(objectUsingControlCharacters)" 66 ); 67 68 reportCompare(0, 0);