├── tests ├── assets │ ├── pass4_result.hjson │ ├── pass4_result.json │ ├── failJSON29_test.json │ ├── failJSON30_test.json │ ├── pass4_test.json │ ├── strings4_result.hjson │ ├── strings4_result.json │ ├── strings4_test.hjson │ ├── failJSON16_test.json │ ├── failJSON31_test.json │ ├── failJSON33_test.json │ ├── empty_test.hjson │ ├── failJSON02_test.json │ ├── failJSON08_test.json │ ├── failJSON23_test.json │ ├── failJSON28_test.json │ ├── failJSON35_test.json │ ├── empty_result.hjson │ ├── empty_result.json │ ├── failJSON05_test.json │ ├── failJSON19_test.json │ ├── failJSON20_test.json │ ├── passSingle_test.hjson │ ├── failJSON06_test.json │ ├── failJSON07_test.json │ ├── failJSON11_test.json │ ├── failStr9a_test.hjson │ ├── passSingle_result.hjson │ ├── passSingle_result.json │ ├── failJSON12_test.json │ ├── failJSON14_test.json │ ├── failJSON15_test.json │ ├── failJSON17_test.json │ ├── failJSON21_test.json │ ├── failJSON22_test.json │ ├── failJSON26_test.json │ ├── failJSON32_test.json │ ├── failKey4_test.hjson │ ├── failJSON13_test.json │ ├── failKey2_test.hjson │ ├── failKey3_test.hjson │ ├── failKey1_test.hjson │ ├── failKey5_test.hjson │ ├── failMLStr1_test.hjson │ ├── pass2_test.json │ ├── failCharset1_test.hjson │ ├── failObj2_test.hjson │ ├── failStr1a_test.hjson │ ├── failStr1b_test.hjson │ ├── failStr2a_test.hjson │ ├── failStr2b_test.hjson │ ├── failStr3a_test.hjson │ ├── failStr3b_test.hjson │ ├── failStr4a_test.hjson │ ├── failStr4b_test.hjson │ ├── failStr5a_test.hjson │ ├── failStr5b_test.hjson │ ├── failStr6a_test.hjson │ ├── failStr6b_test.hjson │ ├── failJSON10_test.json │ ├── failObj1_test.hjson │ ├── failObj3_test.hjson │ ├── failStr1c_test.hjson │ ├── failStr1d_test.hjson │ ├── failStr2c_test.hjson │ ├── failStr2d_test.hjson │ ├── failStr3c_test.hjson │ ├── failStr3d_test.hjson │ ├── failStr4c_test.hjson │ ├── failStr4d_test.hjson │ ├── failStr5c_test.hjson │ ├── failStr5d_test.hjson │ ├── failStr8a_test.hjson │ ├── failObj4_test.hjson │ ├── failJSON34_test.json │ ├── root_result.hjson │ ├── root_result.json │ ├── charset2_result.hjson │ ├── root_test.hjson │ ├── charset2_result.json │ ├── trail_result.hjson │ ├── trail_result.json │ ├── charset2_test.hjson │ ├── oa_test.hjson │ ├── strings3_result.hjson │ ├── oa_result.hjson │ ├── strings3_result.json │ ├── oa_result.json │ ├── pass3_result.hjson │ ├── pass3_result.json │ ├── pass3_test.json │ ├── trail_test.hjson │ ├── failStr6c_test.hjson │ ├── failStr6d_test.hjson │ ├── strings3_test.hjson │ ├── charset_result.hjson │ ├── charset_test.hjson │ ├── charset_result.json │ ├── kan_result.hjson │ ├── comments_result.hjson │ ├── kan_result.json │ ├── keys_result.hjson │ ├── kan_test.hjson │ ├── comments_result.json │ ├── strings2_result.hjson │ ├── strings2_result.json │ ├── keys_result.json │ ├── strings2_test.hjson │ ├── keys_test.hjson │ ├── pass2_result.hjson │ ├── pass2_result.json │ ├── stringify1_result.hjson │ ├── stringify1_test.hjson │ ├── stringify1_result.json │ ├── comments_test.hjson │ ├── strings_result.json │ ├── strings_result.hjson │ ├── pass1_result.hjson │ ├── strings_test.hjson │ ├── pass1_result.json │ ├── pass1_test.json │ ├── large_file_result.hjson │ ├── large_file_result.json │ └── large_file_test.json └── HJSONParserTest.php ├── .gitignore ├── src └── HJSON │ ├── HJSONException.php │ ├── HJSONUtils.php │ ├── HJSONStringifier.php │ └── HJSONParser.php ├── composer.json ├── LICENSE ├── .github └── workflows │ └── test.yml └── README.md /tests/assets/pass4_result.hjson: -------------------------------------------------------------------------------- 1 | 10 2 | -------------------------------------------------------------------------------- /tests/assets/pass4_result.json: -------------------------------------------------------------------------------- 1 | 10 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON29_test.json: -------------------------------------------------------------------------------- 1 | [0e] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON30_test.json: -------------------------------------------------------------------------------- 1 | [0e+] 2 | -------------------------------------------------------------------------------- /tests/assets/pass4_test.json: -------------------------------------------------------------------------------- 1 | 2 | 10 3 | -------------------------------------------------------------------------------- /tests/assets/strings4_result.hjson: -------------------------------------------------------------------------------- 1 | "" 2 | -------------------------------------------------------------------------------- /tests/assets/strings4_result.json: -------------------------------------------------------------------------------- 1 | "" 2 | -------------------------------------------------------------------------------- /tests/assets/strings4_test.hjson: -------------------------------------------------------------------------------- 1 | '''''' 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON16_test.json: -------------------------------------------------------------------------------- 1 | [\naked] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON31_test.json: -------------------------------------------------------------------------------- 1 | [0e+-1] 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | vendor 3 | composer.lock 4 | -------------------------------------------------------------------------------- /tests/assets/failJSON33_test.json: -------------------------------------------------------------------------------- 1 | ["mismatch"} 2 | -------------------------------------------------------------------------------- /tests/assets/empty_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | "": empty 3 | } 4 | -------------------------------------------------------------------------------- /tests/assets/failJSON02_test.json: -------------------------------------------------------------------------------- 1 | ["Unclosed array" 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON08_test.json: -------------------------------------------------------------------------------- 1 | ["Extra close"]] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON23_test.json: -------------------------------------------------------------------------------- 1 | ["Bad value", truth] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON28_test.json: -------------------------------------------------------------------------------- 1 | ["line\ 2 | break"] 3 | -------------------------------------------------------------------------------- /tests/assets/failJSON35_test.json: -------------------------------------------------------------------------------- 1 | { 2 | :0 3 | } 4 | -------------------------------------------------------------------------------- /tests/assets/empty_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | "": empty 3 | } 4 | -------------------------------------------------------------------------------- /tests/assets/empty_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "": "empty" 3 | } 4 | -------------------------------------------------------------------------------- /tests/assets/failJSON05_test.json: -------------------------------------------------------------------------------- 1 | ["double extra comma",,] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON19_test.json: -------------------------------------------------------------------------------- 1 | {"Missing colon" null} 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON20_test.json: -------------------------------------------------------------------------------- 1 | {"Double colon":: null} 2 | -------------------------------------------------------------------------------- /tests/assets/passSingle_test.hjson: -------------------------------------------------------------------------------- 1 | allow quoteless strings 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON06_test.json: -------------------------------------------------------------------------------- 1 | [ , "<-- missing value"] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON07_test.json: -------------------------------------------------------------------------------- 1 | ["Comma after the close"], 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON11_test.json: -------------------------------------------------------------------------------- 1 | {"Illegal expression": 1 + 2} 2 | -------------------------------------------------------------------------------- /tests/assets/failStr9a_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | = 4 | [['''''' 5 | -------------------------------------------------------------------------------- /tests/assets/passSingle_result.hjson: -------------------------------------------------------------------------------- 1 | allow quoteless strings 2 | -------------------------------------------------------------------------------- /tests/assets/passSingle_result.json: -------------------------------------------------------------------------------- 1 | "allow quoteless strings" 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON12_test.json: -------------------------------------------------------------------------------- 1 | {"Illegal invocation": alert()} 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON14_test.json: -------------------------------------------------------------------------------- 1 | {"Numbers cannot be hex": 0x14} 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON15_test.json: -------------------------------------------------------------------------------- 1 | ["Illegal backslash escape: \x15"] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON17_test.json: -------------------------------------------------------------------------------- 1 | ["Illegal backslash escape: \017"] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON21_test.json: -------------------------------------------------------------------------------- 1 | {"Comma instead of colon", null} 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON22_test.json: -------------------------------------------------------------------------------- 1 | ["Colon instead of comma": false] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON26_test.json: -------------------------------------------------------------------------------- 1 | ["tab\ character\ in\ string\ "] 2 | -------------------------------------------------------------------------------- /tests/assets/failJSON32_test.json: -------------------------------------------------------------------------------- 1 | {"Comma instead if closing brace": true, 2 | -------------------------------------------------------------------------------- /tests/assets/failKey4_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid name 3 | : 0 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failJSON13_test.json: -------------------------------------------------------------------------------- 1 | {"Numbers cannot have leading zeroes": 013} 2 | -------------------------------------------------------------------------------- /tests/assets/failKey2_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid name 3 | {name: 0 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failKey3_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid name 3 | key,name: 0 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failKey1_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid name 3 | wrong name: 0 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failKey5_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid name 3 | '''foo''': 0 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failMLStr1_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid multiline string 3 | ml: ''' 4 | -------------------------------------------------------------------------------- /tests/assets/pass2_test.json: -------------------------------------------------------------------------------- 1 | [[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] 2 | -------------------------------------------------------------------------------- /tests/assets/failCharset1_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid \u char 3 | char: "\uxxxx" 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failObj2_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid obj 3 | noEnd 4 | { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /tests/assets/failStr1a_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: ] 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr1b_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: ]x 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr2a_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: } 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr2b_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: }x 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr3a_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: { 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr3b_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: {x 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr4a_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: [ 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr4b_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: [x 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr5a_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: : 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr5b_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: :x 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr6a_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: , 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failStr6b_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid quoteless string 3 | ql: ,x 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failJSON10_test.json: -------------------------------------------------------------------------------- 1 | {"Extra value after close": true} "misplaced quoted value" 2 | -------------------------------------------------------------------------------- /tests/assets/failObj1_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid obj 3 | noDelimiter 4 | { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /tests/assets/failObj3_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # missing key 3 | 4 | [ 5 | test 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /tests/assets/failStr1c_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | ] 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr1d_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | ]x 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr2c_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | } 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr2d_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | }x 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr3c_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | { 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr3d_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | {x 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr4c_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | [ 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr4d_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | [x 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr5c_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | : 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr5d_test.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | foo 3 | # invalid quoteless string 4 | :x 5 | ] 6 | -------------------------------------------------------------------------------- /tests/assets/failStr8a_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # invalid ml-string 3 | foo : ""'text''' 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failObj4_test.hjson: -------------------------------------------------------------------------------- 1 | a: 1 2 | b: 2 3 | # trailing bracket in bracketless root 4 | } 5 | -------------------------------------------------------------------------------- /tests/assets/failJSON34_test.json: -------------------------------------------------------------------------------- 1 | A quoteless string is OK, 2 | but two must be contained in an array. 3 | -------------------------------------------------------------------------------- /tests/assets/root_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | database: 3 | { 4 | host: 127.0.0.1 5 | port: 555 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /tests/assets/root_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "database": { 3 | "host": "127.0.0.1", 4 | "port": 555 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/HJSON/HJSONException.php: -------------------------------------------------------------------------------- 1 | ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé 3 | js-ascii: ! "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé 4 | ml-ascii: ! "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé 5 | } 6 | -------------------------------------------------------------------------------- /tests/assets/charset_test.hjson: -------------------------------------------------------------------------------- 1 | ql-ascii: ! "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé 2 | js-ascii: "! \"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé" 3 | ml-ascii: 4 | ''' 5 | ! "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé 6 | ''' 7 | -------------------------------------------------------------------------------- /tests/assets/charset_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "ql-ascii": "! \"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé", 3 | "js-ascii": "! \"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé", 4 | "ml-ascii": "! \"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄäÅåÖöÉé" 5 | } 6 | -------------------------------------------------------------------------------- /tests/assets/kan_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | numbers: 3 | [ 4 | 0 5 | 0 6 | 0 7 | 42 8 | 42.1 9 | -5 10 | -5.1 11 | 1701 12 | -1701 13 | 12.345 14 | -12.345 15 | ] 16 | native: 17 | [ 18 | true 19 | true 20 | false 21 | false 22 | null 23 | null 24 | ] 25 | strings: 26 | [ 27 | x 0 28 | .0 29 | 00 30 | 01 31 | 0 0 0 32 | 42 x 33 | 42.1 asdf 34 | 1.2.3 35 | -5 0 - 36 | -5.1 -- 37 | 17.01e2 + 38 | -17.01e2 : 39 | 12345e-3 @ 40 | -12345e-3 $ 41 | true true 42 | x true 43 | false false 44 | x false 45 | null null 46 | x null 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /tests/assets/comments_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | foo1: This is a string value. # part of the string 3 | foo2: This is a string value. 4 | bar1: This is a string value. // part of the string 5 | bar2: This is a string value. 6 | foobar1: This is a string value./* part of the string */ 7 | foobar2: This is a string value. 8 | rem1: "# test" 9 | rem2: "// test" 10 | rem3: "/* test */" 11 | num1: 0 12 | num2: 0 13 | num3: 2 14 | true1: true 15 | true2: true 16 | true3: true 17 | false1: false 18 | false2: false 19 | false3: false 20 | null1: null 21 | null2: null 22 | null3: null 23 | str1: 00 # part of the string 24 | str2: 00.0 // part of the string 25 | str3: 02 /* part of the string */ 26 | } 27 | -------------------------------------------------------------------------------- /tests/assets/kan_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "numbers": [ 3 | 0, 4 | 0, 5 | 0, 6 | 42, 7 | 42.1, 8 | -5, 9 | -5.1, 10 | 1701, 11 | -1701, 12 | 12.345, 13 | -12.345 14 | ], 15 | "native": [ 16 | true, 17 | true, 18 | false, 19 | false, 20 | null, 21 | null 22 | ], 23 | "strings": [ 24 | "x 0", 25 | ".0", 26 | "00", 27 | "01", 28 | "0 0 0", 29 | "42 x", 30 | "42.1 asdf", 31 | "1.2.3", 32 | "-5 0 -", 33 | "-5.1 --", 34 | "17.01e2 +", 35 | "-17.01e2 :", 36 | "12345e-3 @", 37 | "-12345e-3 $", 38 | "true true", 39 | "x true", 40 | "false false", 41 | "x false", 42 | "null null", 43 | "x null" 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /tests/assets/keys_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | unquoted_key: test 3 | _unquoted: test 4 | test-key: test 5 | -test: test 6 | .key: test 7 | trailing: test 8 | trailing2: test 9 | "#c1": test 10 | "foo#bar": test 11 | "//bar": test 12 | "foo//bar": test 13 | "/*foo*/": test 14 | "foo/*foo*/bar": test 15 | "/*": test 16 | "foo/*bar": test 17 | "\"": test 18 | "foo\"bar": test 19 | "'''": test 20 | "foo'''bar": test 21 | "'": test 22 | "'foo": test 23 | "foo'bar": test 24 | ":": test 25 | "foo:bar": test 26 | "{": test 27 | "foo{bar": test 28 | "}": test 29 | "foo}bar": test 30 | "[": test 31 | "foo[bar": test 32 | "]": test 33 | "foo]bar": test 34 | nl1: test 35 | nl2: test 36 | nl3: test 37 | } 38 | -------------------------------------------------------------------------------- /tests/assets/kan_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # the comma forces a whitespace check 3 | numbers: 4 | [ 5 | 0 6 | 0 , 7 | -0 8 | 42 , 9 | 42.1 , 10 | -5 11 | -5.1 12 | 17.01e2 13 | -17.01e2 14 | 12345e-3 , 15 | -12345e-3 , 16 | ] 17 | native: 18 | [ 19 | true , 20 | true 21 | false , 22 | false 23 | null , 24 | null 25 | ] 26 | strings: 27 | [ 28 | x 0 29 | .0 30 | 00 31 | 01 32 | 0 0 0 33 | 42 x 34 | 42.1 asdf 35 | 1.2.3 36 | -5 0 - 37 | -5.1 -- 38 | 17.01e2 + 39 | -17.01e2 : 40 | 12345e-3 @ 41 | -12345e-3 $ 42 | true true 43 | x true 44 | false false 45 | x false 46 | null null 47 | x null 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /tests/assets/comments_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "foo1": "This is a string value. # part of the string", 3 | "foo2": "This is a string value.", 4 | "bar1": "This is a string value. // part of the string", 5 | "bar2": "This is a string value.", 6 | "foobar1": "This is a string value./* part of the string */", 7 | "foobar2": "This is a string value.", 8 | "rem1": "# test", 9 | "rem2": "// test", 10 | "rem3": "/* test */", 11 | "num1": 0, 12 | "num2": 0, 13 | "num3": 2, 14 | "true1": true, 15 | "true2": true, 16 | "true3": true, 17 | "false1": false, 18 | "false2": false, 19 | "false3": false, 20 | "null1": null, 21 | "null2": null, 22 | "null3": null, 23 | "str1": "00 # part of the string", 24 | "str2": "00.0 // part of the string", 25 | "str3": "02 /* part of the string */" 26 | } 27 | -------------------------------------------------------------------------------- /tests/assets/strings2_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | key1: a key in single quotes 3 | "key 2": a key in single quotes 4 | "key \"": a key in single quotes 5 | text: 6 | [ 7 | single quoted string 8 | '''You need quotes for escapes''' 9 | " untrimmed " 10 | "untrimmed " 11 | containing " double quotes 12 | containing " double quotes 13 | containing " double quotes 14 | '''"containing more " double quotes"''' 15 | containing ' single quotes 16 | containing ' single quotes 17 | containing ' single quotes 18 | "'containing more ' single quotes'" 19 | "'containing more ' single quotes'" 20 | "\n" 21 | " \n" 22 | "\n \n \n \n" 23 | "\t\n" 24 | ] 25 | foo3a: asdf''' 26 | foo3b: "'''asdf" 27 | foo4a: "asdf'''\nasdf" 28 | foo4b: "asdf\n'''asdf" 29 | } 30 | -------------------------------------------------------------------------------- /tests/assets/strings2_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "key1": "a key in single quotes", 3 | "key 2": "a key in single quotes", 4 | "key \"": "a key in single quotes", 5 | "text": [ 6 | "single quoted string", 7 | "You need quotes\tfor escapes", 8 | " untrimmed ", 9 | "untrimmed ", 10 | "containing \" double quotes", 11 | "containing \" double quotes", 12 | "containing \" double quotes", 13 | "\"containing more \" double quotes\"", 14 | "containing ' single quotes", 15 | "containing ' single quotes", 16 | "containing ' single quotes", 17 | "'containing more ' single quotes'", 18 | "'containing more ' single quotes'", 19 | "\n", 20 | " \n", 21 | "\n \n \n \n", 22 | "\t\n" 23 | ], 24 | "foo3a": "asdf'''", 25 | "foo3b": "'''asdf", 26 | "foo4a": "asdf'''\nasdf", 27 | "foo4b": "asdf\n'''asdf" 28 | } 29 | -------------------------------------------------------------------------------- /tests/assets/keys_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "unquoted_key": "test", 3 | "_unquoted": "test", 4 | "test-key": "test", 5 | "-test": "test", 6 | ".key": "test", 7 | "trailing": "test", 8 | "trailing2": "test", 9 | "#c1": "test", 10 | "foo#bar": "test", 11 | "//bar": "test", 12 | "foo//bar": "test", 13 | "/*foo*/": "test", 14 | "foo/*foo*/bar": "test", 15 | "/*": "test", 16 | "foo/*bar": "test", 17 | "\"": "test", 18 | "foo\"bar": "test", 19 | "'''": "test", 20 | "foo'''bar": "test", 21 | "'": "test", 22 | "'foo": "test", 23 | "foo'bar": "test", 24 | ":": "test", 25 | "foo:bar": "test", 26 | "{": "test", 27 | "foo{bar": "test", 28 | "}": "test", 29 | "foo}bar": "test", 30 | "[": "test", 31 | "foo[bar": "test", 32 | "]": "test", 33 | "foo]bar": "test", 34 | "nl1": "test", 35 | "nl2": "test", 36 | "nl3": "test" 37 | } 38 | -------------------------------------------------------------------------------- /tests/assets/strings2_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # Hjson 3 allows the use of single quotes 3 | 4 | 'key1': a key in single quotes 5 | 'key 2': a key in single quotes 6 | 'key "': a key in single quotes 7 | 8 | text: [ 9 | 'single quoted string' 10 | 'You need quotes\tfor escapes' 11 | ' untrimmed ' 12 | 'untrimmed ' 13 | 'containing " double quotes' 14 | 'containing \" double quotes' 15 | "containing \" double quotes" 16 | '"containing more " double quotes"' 17 | 'containing \' single quotes' 18 | "containing ' single quotes" 19 | "containing \' single quotes" 20 | "'containing more ' single quotes'" 21 | "\'containing more \' single quotes\'" 22 | 23 | '\n' 24 | ' \n' 25 | '\n \n \n \n' 26 | '\t\n' 27 | ] 28 | 29 | # escapes/no escape 30 | 31 | foo3a: 'asdf\'\'\'' 32 | foo3b: '\'\'\'asdf' 33 | 34 | foo4a: 'asdf\'\'\'\nasdf' 35 | foo4b: 'asdf\n\'\'\'asdf' 36 | } 37 | -------------------------------------------------------------------------------- /tests/assets/keys_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # unquoted keys 3 | unquoted_key: test 4 | _unquoted: test 5 | test-key: test 6 | -test: test 7 | .key: test 8 | # trailing spaces in key names are ignored 9 | trailing : test 10 | trailing2 : test 11 | # comment char in key name 12 | "#c1": test 13 | "foo#bar": test 14 | "//bar": test 15 | "foo//bar": test 16 | "/*foo*/": test 17 | "foo/*foo*/bar": test 18 | "/*": test 19 | "foo/*bar": test 20 | # quotes in key name 21 | "\"": test 22 | "foo\"bar": test 23 | "'''": test 24 | "foo'''bar": test 25 | "'": test 26 | "'foo": test 27 | "foo'bar": test 28 | # control char in key name 29 | ":": test 30 | "foo:bar": test 31 | "{": test 32 | "foo{bar": test 33 | "}": test 34 | "foo}bar": test 35 | "[": test 36 | "foo[bar": test 37 | "]": test 38 | "foo]bar": test 39 | # newline 40 | nl1: 41 | test 42 | nl2 43 | : 44 | test 45 | 46 | nl3 47 | 48 | : 49 | 50 | test 51 | } 52 | -------------------------------------------------------------------------------- /tests/assets/pass2_result.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | [ 4 | [ 5 | [ 6 | [ 7 | [ 8 | [ 9 | [ 10 | [ 11 | [ 12 | [ 13 | [ 14 | [ 15 | [ 16 | [ 17 | [ 18 | [ 19 | [ 20 | Not too deep 21 | ] 22 | ] 23 | ] 24 | ] 25 | ] 26 | ] 27 | ] 28 | ] 29 | ] 30 | ] 31 | ] 32 | ] 33 | ] 34 | ] 35 | ] 36 | ] 37 | ] 38 | ] 39 | ] 40 | -------------------------------------------------------------------------------- /tests/assets/pass2_result.json: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | [ 4 | [ 5 | [ 6 | [ 7 | [ 8 | [ 9 | [ 10 | [ 11 | [ 12 | [ 13 | [ 14 | [ 15 | [ 16 | [ 17 | [ 18 | [ 19 | [ 20 | "Not too deep" 21 | ] 22 | ] 23 | ] 24 | ] 25 | ] 26 | ] 27 | ] 28 | ] 29 | ] 30 | ] 31 | ] 32 | ] 33 | ] 34 | ] 35 | ] 36 | ] 37 | ] 38 | ] 39 | ] 40 | -------------------------------------------------------------------------------- /tests/assets/stringify1_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | quotes: 3 | { 4 | num1: "1,2" 5 | num2: "-1.1 ," 6 | num3: "1e10 ,2" 7 | num4: "-1e-10," 8 | kw1: "true," 9 | kw2: "false ," 10 | kw3: "null,123" 11 | close1: "1}" 12 | close1b: "1 }" 13 | close2: "1]" 14 | close2b: "1 ]" 15 | close3: "1," 16 | close3b: "1 ," 17 | comment1: "1#str" 18 | comment2: "1//str" 19 | comment3: "1/*str*/" 20 | punc1: "{" 21 | punc1b: "{foo" 22 | punc2: "}" 23 | punc2b: "}foo" 24 | punc3: "[" 25 | punc3b: "[foo" 26 | punc4: "]" 27 | punc4b: "]foo" 28 | punc5: "," 29 | punc5b: ",foo" 30 | punc6: ":" 31 | punc6b: ":foo" 32 | } 33 | noquotes: 34 | { 35 | num0: .1,2 36 | num1: 1.1.1,2 37 | num2: -.1, 38 | num3: 1e10e,2 39 | num4: -1e--10, 40 | kw1: true1, 41 | kw2: false0, 42 | kw3: null0, 43 | close1: a} 44 | close2: a] 45 | comment1: a#str 46 | comment2: a//str 47 | comment3: a/*str*/ 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laktak/hjson", 3 | "description": "JSON for Humans. A configuration file format with relaxed syntax, fewer mistakes and more comments.", 4 | "license": "MIT", 5 | "type": "library", 6 | "authors": [ 7 | { 8 | "name": "Issam Zoli", 9 | "email": "jawbfl@gmail.com", 10 | "role": "Developer" 11 | } 12 | ], 13 | "homepage": "https://github.com/hjson/hjson-php", 14 | "keywords": [ 15 | "json", 16 | "comments", 17 | "config", 18 | "hjson", 19 | "parser", 20 | "serializer", 21 | "human" 22 | ], 23 | "require": { 24 | "php": ">=5.6", 25 | "ext-mbstring": "*" 26 | }, 27 | "require-dev": { 28 | "squizlabs/php_codesniffer": "^3" 29 | }, 30 | "autoload": { 31 | "psr-4": { 32 | "HJSON\\": "src/HJSON" 33 | } 34 | }, 35 | "autoload-dev": { 36 | "psr-4": { 37 | "HJSON\\Tests\\": "tests/" 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/assets/stringify1_test.hjson: -------------------------------------------------------------------------------- 1 | // test if stringify produces correct output 2 | { 3 | quotes: 4 | { 5 | num1: "1,2" 6 | num2: "-1.1 ," 7 | num3: "1e10 ,2" 8 | num4: "-1e-10," 9 | kw1: "true," 10 | kw2: "false ," 11 | kw3: "null,123" 12 | close1: "1}" 13 | close1b: "1 }" 14 | close2: "1]" 15 | close2b: "1 ]" 16 | close3: "1," 17 | close3b: "1 ," 18 | comment1: "1#str" 19 | comment2: "1//str" 20 | comment3: "1/*str*/" 21 | punc1: "{" 22 | punc1b: "{foo" 23 | punc2: "}" 24 | punc2b: "}foo" 25 | punc3: "[" 26 | punc3b: "[foo" 27 | punc4: "]" 28 | punc4b: "]foo" 29 | punc5: "," 30 | punc5b: ",foo" 31 | punc6: ":" 32 | punc6b: ":foo" 33 | } 34 | noquotes: 35 | { 36 | num0: ".1,2" 37 | num1: "1.1.1,2" 38 | num2: "-.1," 39 | num3: "1e10e,2" 40 | num4: "-1e--10," 41 | kw1: "true1," 42 | kw2: "false0," 43 | kw3: "null0," 44 | close1: "a}" 45 | close2: "a]" 46 | comment1: "a#str" 47 | comment2: "a//str" 48 | comment3: "a/*str*/" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014, 2015 Christian Zangl 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /tests/assets/stringify1_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "quotes": { 3 | "num1": "1,2", 4 | "num2": "-1.1 ,", 5 | "num3": "1e10 ,2", 6 | "num4": "-1e-10,", 7 | "kw1": "true,", 8 | "kw2": "false ,", 9 | "kw3": "null,123", 10 | "close1": "1}", 11 | "close1b": "1 }", 12 | "close2": "1]", 13 | "close2b": "1 ]", 14 | "close3": "1,", 15 | "close3b": "1 ,", 16 | "comment1": "1#str", 17 | "comment2": "1//str", 18 | "comment3": "1/*str*/", 19 | "punc1": "{", 20 | "punc1b": "{foo", 21 | "punc2": "}", 22 | "punc2b": "}foo", 23 | "punc3": "[", 24 | "punc3b": "[foo", 25 | "punc4": "]", 26 | "punc4b": "]foo", 27 | "punc5": ",", 28 | "punc5b": ",foo", 29 | "punc6": ":", 30 | "punc6b": ":foo" 31 | }, 32 | "noquotes": { 33 | "num0": ".1,2", 34 | "num1": "1.1.1,2", 35 | "num2": "-.1,", 36 | "num3": "1e10e,2", 37 | "num4": "-1e--10,", 38 | "kw1": "true1,", 39 | "kw2": "false0,", 40 | "kw3": "null0,", 41 | "close1": "a}", 42 | "close2": "a]", 43 | "comment1": "a#str", 44 | "comment2": "a//str", 45 | "comment3": "a/*str*/" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /tests/assets/comments_test.hjson: -------------------------------------------------------------------------------- 1 | // test 2 | # all 3 | // comment 4 | /* 5 | styles 6 | */ 7 | # with lf 8 | 9 | 10 | 11 | # ! 12 | 13 | { 14 | # hjson style comment åäö 15 | foo1: This is a string value. # part of the string 16 | foo2: "This is a string value." # a comment 17 | 18 | // js style comment 19 | bar1: This is a string value. // part of the string 20 | bar2: "This is a string value." // a comment 21 | 22 | /* js block style comments */foobar1:/* more */This is a string value./* part of the string */ 23 | /* js block style comments */foobar2:/* more */"This is a string value."/* a comment */ 24 | 25 | rem1: "# test" 26 | rem2: "// test" 27 | rem3: "/* test */" 28 | 29 | num1: 0 # comment 30 | num2: 0.0 // comment 31 | num3: 2 /* comment */ 32 | 33 | true1: true # comment 34 | true2: true // comment 35 | true3: true /* comment */ 36 | 37 | false1: false # comment 38 | false2: false // comment 39 | false3: false /* comment */ 40 | 41 | null1: null # comment 42 | null2: null // comment 43 | null3: null /* comment */ 44 | 45 | str1: 00 # part of the string 46 | str2: 00.0 // part of the string 47 | str3: 02 /* part of the string */ 48 | } 49 | -------------------------------------------------------------------------------- /tests/assets/strings_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "text1": "This is a valid string value.", 3 | "text2": "a \\ is just a \\", 4 | "text3": "You need quotes\tfor escapes", 5 | "text4a": " untrimmed ", 6 | "text4b": " untrimmed", 7 | "text4c": "untrimmed ", 8 | "notml1": "\n", 9 | "notml2": " \n", 10 | "notml3": "\n \n \n \n", 11 | "notml4": "\t\n", 12 | "multiline1": "first line\n indented line\nlast line", 13 | "multiline2": "first line\n indented line\nlast line", 14 | "multiline3": "first line\n indented line\nlast line\n", 15 | "multiline4": "←→±≠Я", 16 | "multiline5": "åäö", 17 | "multiline6": "bar\n0", 18 | "foo1a": "asdf\\\"'a\\s\\w", 19 | "foo1b": "asdf\\\"'a\\s\\w", 20 | "foo1c": "asdf\\\"'a\\s\\w", 21 | "foo2a": "\"asdf\"", 22 | "foo2b": "\"asdf\"", 23 | "foo3a": "asdf'''", 24 | "foo3b": "'''asdf", 25 | "foo4a": "asdf'''\nasdf", 26 | "foo4b": "asdf\n'''asdf", 27 | "arr": [ 28 | "one", 29 | "two", 30 | "three", 31 | "four" 32 | ], 33 | "not": { 34 | "number": 5, 35 | "negative": -4.2, 36 | "yes": true, 37 | "no": false, 38 | "null": null, 39 | "array": [ 40 | 1, 41 | 2, 42 | 3, 43 | 4, 44 | 5, 45 | 6, 46 | 7, 47 | 8, 48 | 9, 49 | 0, 50 | -1, 51 | 0.5 52 | ] 53 | }, 54 | "special": { 55 | "true": "true", 56 | "false": "false", 57 | "null": "null", 58 | "one": "1", 59 | "two": "2", 60 | "minus": "-3", 61 | "zero": "0" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | permissions: 10 | contents: read 11 | 12 | jobs: 13 | test: 14 | name: ${{ matrix.name }} 15 | runs-on: ${{ matrix.os }} 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | include: 20 | - name: php-8.1 21 | os: ubuntu-latest 22 | php-version: '8.1' 23 | - name: php-8.2 24 | os: ubuntu-latest 25 | php-version: '8.2' 26 | - name: php-8.3 27 | os: ubuntu-latest 28 | php-version: '8.3' 29 | - name: php-8.4 30 | os: ubuntu-latest 31 | php-version: '8.4' 32 | - name: ubuntu-latest 33 | os: ubuntu-latest 34 | steps: 35 | - if: ${{ matrix.php-version }} 36 | uses: shivammathur/setup-php@v2 37 | with: 38 | php-version: ${{ matrix.php-version }} 39 | 40 | - uses: actions/checkout@v4 41 | 42 | - name: Validate composer.json and composer.lock 43 | run: composer validate --strict 44 | 45 | - name: Install dependencies 46 | run: composer install --prefer-dist --no-progress 47 | 48 | - name: phpcs 49 | run: ./vendor/bin/phpcs -n --standard=PSR2 src/ tests/ 50 | 51 | - name: PHP version 52 | run: php -v 53 | 54 | - name: tests 55 | run: php ./tests/HJSONParserTest.php 56 | -------------------------------------------------------------------------------- /tests/assets/strings_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | text1: This is a valid string value. 3 | text2: a \ is just a \ 4 | text3: '''You need quotes for escapes''' 5 | text4a: " untrimmed " 6 | text4b: " untrimmed" 7 | text4c: "untrimmed " 8 | notml1: "\n" 9 | notml2: " \n" 10 | notml3: "\n \n \n \n" 11 | notml4: "\t\n" 12 | multiline1: 13 | ''' 14 | first line 15 | indented line 16 | last line 17 | ''' 18 | multiline2: 19 | ''' 20 | first line 21 | indented line 22 | last line 23 | ''' 24 | multiline3: 25 | ''' 26 | first line 27 | indented line 28 | last line 29 | 30 | ''' 31 | multiline4: ←→±≠Я 32 | multiline5: åäö 33 | multiline6: 34 | ''' 35 | bar 36 | 0 37 | ''' 38 | foo1a: asdf\"'a\s\w 39 | foo1b: asdf\"'a\s\w 40 | foo1c: asdf\"'a\s\w 41 | foo2a: '''"asdf"''' 42 | foo2b: '''"asdf"''' 43 | foo3a: asdf''' 44 | foo3b: "'''asdf" 45 | foo4a: "asdf'''\nasdf" 46 | foo4b: "asdf\n'''asdf" 47 | arr: 48 | [ 49 | one 50 | two 51 | three 52 | four 53 | ] 54 | not: 55 | { 56 | number: 5 57 | negative: -4.2 58 | yes: true 59 | no: false 60 | null: null 61 | array: 62 | [ 63 | 1 64 | 2 65 | 3 66 | 4 67 | 5 68 | 6 69 | 7 70 | 8 71 | 9 72 | 0 73 | -1 74 | 0.5 75 | ] 76 | } 77 | special: 78 | { 79 | true: "true" 80 | false: "false" 81 | null: "null" 82 | one: "1" 83 | two: "2" 84 | minus: "-3" 85 | zero: "0" 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /tests/assets/pass1_result.hjson: -------------------------------------------------------------------------------- 1 | [ 2 | JSON Test Pattern pass1 3 | { 4 | "object with 1 member": 5 | [ 6 | array with 1 element 7 | ] 8 | } 9 | {} 10 | [] 11 | { 12 | 1: foo 13 | 3: bar 14 | } 15 | { 16 | foo: foo 17 | bar: bar 18 | } 19 | -42 20 | true 21 | false 22 | null 23 | { 24 | integer: 1234567890 25 | real: -9876.54321 26 | e: 1.23456789e-13 27 | E: 1.23456789e+34 28 | -: 2.3456789012e+76 29 | zero: 0 30 | one: 1 31 | space: " " 32 | quote: '''"''' 33 | backslash: \ 34 | controls: "\b\f\n\r\t" 35 | slash: / & / 36 | alpha: abcdefghijklmnopqrstuvwyz 37 | ALPHA: ABCDEFGHIJKLMNOPQRSTUVWYZ 38 | digit: 0123456789 39 | 0123456789: digit 40 | special: `1~!@#$%^&*()_+-={':[,]}|;.? 41 | hex: ģ䕧覫췯ꯍ 42 | true: true 43 | false: false 44 | null: null 45 | array: [] 46 | object: {} 47 | address: 50 St. James Street 48 | url: http://www.JSON.org/ 49 | comment: "// /* */": " " 51 | " s p a c e d ": 52 | [ 53 | 1 54 | 2 55 | 3 56 | 4 57 | 5 58 | 6 59 | 7 60 | ] 61 | compact: 62 | [ 63 | 1 64 | 2 65 | 3 66 | 4 67 | 5 68 | 6 69 | 7 70 | ] 71 | jsontext: '''{"object with 1 member":["array with 1 element"]}''' 72 | quotes: " " %22 0x22 034 " 73 | "/\\\"쫾몾ꮘﳞ볚\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?": A key can be any string 74 | } 75 | 0.5 76 | 98.6 77 | 99.44 78 | 1066 79 | 10 80 | 1 81 | 0.1 82 | 1 83 | 2 84 | 2 85 | rosebud 86 | ] 87 | -------------------------------------------------------------------------------- /tests/assets/strings_test.hjson: -------------------------------------------------------------------------------- 1 | { 2 | # simple 3 | 4 | text1: This is a valid string value. 5 | text2:a \ is just a \ 6 | 7 | text3: "You need quotes\tfor escapes" 8 | 9 | text4a: " untrimmed " 10 | text4b: " untrimmed" 11 | text4c: "untrimmed " 12 | 13 | notml1: "\n" 14 | notml2: " \n" 15 | notml3: "\n \n \n \n" 16 | notml4: "\t\n" 17 | 18 | # multiline string 19 | 20 | multiline1: 21 | ''' 22 | first line 23 | indented line 24 | last line 25 | ''' 26 | 27 | multiline2: 28 | '''first line 29 | indented line 30 | last line''' 31 | 32 | multiline3: 33 | ''' 34 | first line 35 | indented line 36 | last line 37 | 38 | ''' # trailing lf 39 | 40 | multiline4: 41 | ''' 42 | ←→±≠Я 43 | ''' 44 | 45 | multiline5: 46 | ''' 47 | åäö 48 | ''' 49 | 50 | multiline6: "bar\n0" 51 | 52 | # escapes/no escape 53 | 54 | foo1a: asdf\"'a\s\w 55 | foo1b: '''asdf\"'a\s\w''' 56 | foo1c: "asdf\\\"'a\\s\\w" 57 | 58 | foo2a: "\"asdf\"" 59 | foo2b: '''"asdf"''' 60 | 61 | foo3a: "asdf'''" 62 | foo3b: "'''asdf" 63 | 64 | foo4a: "asdf'''\nasdf" 65 | foo4b: "asdf\n'''asdf" 66 | 67 | # in arrays 68 | arr: 69 | [ 70 | one 71 | two 72 | "three" 73 | '''four''' 74 | ] 75 | 76 | # not strings 77 | not: 78 | { 79 | number: 5 80 | negative: -4.2 81 | yes: true 82 | no: false 83 | null: null 84 | array: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, 0.5 ] 85 | } 86 | 87 | # special quoted 88 | special: 89 | { 90 | true: "true" 91 | false: "false" 92 | null: "null" 93 | one: "1" 94 | two: "2" 95 | minus: "-3" 96 | zero: "0" 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /tests/assets/pass1_result.json: -------------------------------------------------------------------------------- 1 | [ 2 | "JSON Test Pattern pass1", 3 | { 4 | "object with 1 member": [ 5 | "array with 1 element" 6 | ] 7 | }, 8 | {}, 9 | [], 10 | { 11 | "1": "foo", 12 | "3": "bar" 13 | }, 14 | { 15 | "foo": "foo", 16 | "bar": "bar" 17 | }, 18 | -42, 19 | true, 20 | false, 21 | null, 22 | { 23 | "integer": 1234567890, 24 | "real": -9876.54321, 25 | "e": 1.23456789e-13, 26 | "E": 1.23456789e+34, 27 | "-": 2.3456789012e+76, 28 | "zero": 0, 29 | "one": 1, 30 | "space": " ", 31 | "quote": "\"", 32 | "backslash": "\\", 33 | "controls": "\b\f\n\r\t", 34 | "slash": "/ & /", 35 | "alpha": "abcdefghijklmnopqrstuvwyz", 36 | "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", 37 | "digit": "0123456789", 38 | "0123456789": "digit", 39 | "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", 40 | "hex": "ģ䕧覫췯ꯍ", 41 | "true": true, 42 | "false": false, 43 | "null": null, 44 | "array": [], 45 | "object": {}, 46 | "address": "50 St. James Street", 47 | "url": "http://www.JSON.org/", 48 | "comment": "// /* */": " ", 50 | " s p a c e d ": [ 51 | 1, 52 | 2, 53 | 3, 54 | 4, 55 | 5, 56 | 6, 57 | 7 58 | ], 59 | "compact": [ 60 | 1, 61 | 2, 62 | 3, 63 | 4, 64 | 5, 65 | 6, 66 | 7 67 | ], 68 | "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", 69 | "quotes": "" \" %22 0x22 034 "", 70 | "/\\\"쫾몾ꮘﳞ볚\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?": "A key can be any string" 71 | }, 72 | 0.5, 73 | 98.6, 74 | 99.44, 75 | 1066, 76 | 10, 77 | 1, 78 | 0.1, 79 | 1, 80 | 2, 81 | 2, 82 | "rosebud" 83 | ] 84 | -------------------------------------------------------------------------------- /tests/assets/pass1_test.json: -------------------------------------------------------------------------------- 1 | [ 2 | "JSON Test Pattern pass1", 3 | {"object with 1 member":["array with 1 element"]}, 4 | {}, 5 | [], 6 | { 7 | "1": "foo", 8 | "3": "bar" 9 | }, 10 | { 11 | "foo": "foo", 12 | "bar": "bar" 13 | }, 14 | -42, 15 | true, 16 | false, 17 | null, 18 | { 19 | "integer": 1234567890, 20 | "real": -9876.543210, 21 | "e": 0.123456789e-12, 22 | "E": 1.234567890E+34, 23 | "-": 23456789012E66, 24 | "zero": 0, 25 | "one": 1, 26 | "space": " ", 27 | "quote": "\"", 28 | "backslash": "\\", 29 | "controls": "\b\f\n\r\t", 30 | "slash": "/ & \/", 31 | "alpha": "abcdefghijklmnopqrstuvwyz", 32 | "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", 33 | "digit": "0123456789", 34 | "0123456789": "digit", 35 | "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", 36 | "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", 37 | "true": true, 38 | "false": false, 39 | "null": null, 40 | "array":[ ], 41 | "object":{ }, 42 | "address": "50 St. James Street", 43 | "url": "http://www.JSON.org/", 44 | "comment": "// /* */": " ", 46 | " s p a c e d " :[1,2 , 3 47 | 48 | , 49 | 50 | 4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], 51 | "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", 52 | "quotes": "" \u0022 %22 0x22 034 "", 53 | "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" 54 | : "A key can be any string" 55 | }, 56 | 0.5 ,98.6 57 | , 58 | 99.44 59 | , 60 | 61 | 1066, 62 | 1e1, 63 | 0.1e1, 64 | 1e-1, 65 | 1e00,2e+00,2e-00 66 | ,"rosebud"] 67 | -------------------------------------------------------------------------------- /src/HJSON/HJSONUtils.php: -------------------------------------------------------------------------------- 1 | $at ? $text[$at] : null; 20 | $at++; 21 | return $ch; 22 | }; 23 | 24 | $next(); 25 | 26 | if ($ch === '-') { 27 | $string = '-'; 28 | $next(); 29 | } 30 | 31 | while ($ch !== null && $ch >= '0' && $ch <= '9') { 32 | if ($testLeading) { 33 | if ($ch == '0') { 34 | $leadingZeros++; 35 | } else { 36 | $testLeading = false; 37 | } 38 | } 39 | $string .= $ch; 40 | $next(); 41 | } 42 | if ($testLeading) { 43 | $leadingZeros--; // single 0 is allowed 44 | } 45 | if ($ch === '.') { 46 | $string .= '.'; 47 | while ($next() !== null && $ch >= '0' && $ch <= '9') { 48 | $string .= $ch; 49 | } 50 | } 51 | if ($ch === 'e' || $ch === 'E') { 52 | $string .= $ch; 53 | $next(); 54 | if ($ch === '-' || $ch === '+') { 55 | $string .= $ch; 56 | $next(); 57 | } 58 | while ($ch !== null && $ch >= '0' && $ch <= '9') { 59 | $string .= $ch; 60 | $next(); 61 | } 62 | } 63 | 64 | // skip white/to (newline) 65 | while ($ch !== null && $ch <= ' ') { 66 | $next(); 67 | } 68 | 69 | if ($stopAtNext) { 70 | // end scan if we find a control character like ,}] or a comment 71 | if ($ch === ',' || $ch === '}' || $ch === ']' || 72 | $ch === '#' || $ch === '/' && ($text[$at] === '/' || $text[$at] === '*')) { 73 | $ch = null; 74 | } 75 | } 76 | 77 | $number = $string; 78 | if (is_numeric($string)) { 79 | $number = 0+$string; 80 | } 81 | 82 | 83 | if ($ch !== null || $leadingZeros || !is_numeric($number)) { 84 | return null; 85 | } else { 86 | return $number; 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hjson-php 2 | 3 | [![Build Status](https://github.com/hjson/hjson-php/workflows/test/badge.svg)](https://github.com/hjson/hjson-php/actions) 4 | [![Packagist](https://img.shields.io/packagist/v/laktak/hjson.svg?style=flat-square)](https://packagist.org/packages/laktak/hjson) 5 | 6 | [Hjson](https://hjson.github.io), the Human JSON. A configuration file format for humans. Relaxed syntax, fewer mistakes, more comments. 7 | 8 | ![Hjson Intro](https://hjson.github.io/hjson1.gif) 9 | 10 | ``` 11 | { 12 | # specify rate in requests/second (because comments are helpful!) 13 | rate: 1000 14 | 15 | // prefer c-style comments? 16 | /* feeling old fashioned? */ 17 | 18 | # did you notice that rate doesn't need quotes? 19 | hey: look ma, no quotes for strings either! 20 | 21 | # best of all 22 | notice: [] 23 | anything: ? 24 | 25 | # yes, commas are optional! 26 | } 27 | ``` 28 | 29 | The PHP implementation of Hjson is based on [hjson-js](https://github.com/hjson/hjson-js). For other platforms see [hjson.github.io](https://hjson.github.io). 30 | 31 | # Install from composer 32 | 33 | ``` 34 | composer require laktak/hjson 35 | ``` 36 | 37 | # Usage 38 | 39 | ``` 40 | use HJSON\HJSONParser; 41 | use HJSON\HJSONStringifier; 42 | 43 | $parser = new HJSONParser(); 44 | $obj = $parser->parse(hjsonText); 45 | 46 | $stringifier = new HJSONStringifier(); 47 | $text = $stringifier->stringify($obj); 48 | ``` 49 | 50 | 51 | # API 52 | 53 | ### HJSONParser: parse($text, $options) 54 | 55 | This method parses *JSON* or *Hjson* text to produce an object or array. 56 | 57 | - *text*: the string to parse as JSON or Hjson 58 | - *options*: array 59 | - *keepWsc*: boolean, keep white space and comments. This is useful if you want to edit an hjson file and save it while preserving comments (default false) 60 | - *assoc*: boolean, return associative array instead of object (default false) 61 | 62 | ### HJSONStringifier: stringify($value, $options) 63 | 64 | This method produces Hjson text from a value. 65 | 66 | - *value*: any value, usually an object or array. 67 | - *options*: array 68 | - *keepWsc*: boolean, keep white space. See parse. 69 | - *bracesSameLine*: boolean, makes braces appear on the same line as the key name. Default false. 70 | - *quotes*: string, controls how strings are displayed. 71 | - "min": no quotes whenever possible (default) 72 | - "always": always use quotes 73 | - *space*: specifies the indentation of nested structures. If it is a number, it will specify the number of spaces to indent at each level. If it is a string (such as '\t' or ' '), it contains the characters used to indent at each level. 74 | - *eol*: specifies the EOL sequence 75 | 76 | 77 | ## modify & keep comments 78 | 79 | You can modify a Hjson file and keep the whitespace & comments intact. This is useful if an app updates its config file. 80 | 81 | ``` 82 | $parser = new HJSONParser(); 83 | $stringifier = new HJSONStringifier(); 84 | 85 | $text = "{ 86 | # specify rate in requests/second (because comments are helpful!) 87 | rate: 1000 88 | 89 | // prefer c-style comments? 90 | /* feeling old fashioned? */ 91 | 92 | # did you notice that rate doesn't need quotes? 93 | hey: look ma, no quotes for strings either! 94 | 95 | # best of all 96 | notice: [] 97 | anything: ? 98 | 99 | # yes, commas are optional! 100 | 101 | array: [ 102 | // hello 103 | 0 104 | 1 105 | 2 106 | ] 107 | }"; 108 | 109 | // Parse, keep whitespace and comments 110 | $data = $parser->parseWsc($text); 111 | 112 | // Modify like you normally would 113 | $data->rate = 500; 114 | 115 | // You can also edit comments by accessing __WSC__ 116 | $wsc1 = &$data->__WSC__; // for objects 117 | $wsc2 = &$data->array['__WSC__']; // for arrays 118 | 119 | // __WSC__ for objects contains { c: {}, o: [] } 120 | // - c with the actual comment and, firts comment is key ' ' 121 | // - o (array) with the order of the members 122 | $emptyKey = " "; 123 | $wsc1->c->$emptyKey = "\n # This is the first comment"; 124 | $wsc1->c->rate = "\n # This is the comment after rate"; 125 | 126 | // Sort comments order just because we can 127 | sort($wsc1->o); 128 | 129 | // Edit array comments 130 | $wsc2[0] .= ' world'; 131 | 132 | // convert back to Hjson 133 | $text2 = $stringifier->stringifyWsc($data); 134 | ``` 135 | 136 | # History 137 | 138 | [see releases](https://github.com/hjson/hjson-php/releases) 139 | -------------------------------------------------------------------------------- /tests/HJSONParserTest.php: -------------------------------------------------------------------------------- 1 | = count($a2) || $b2[$indexB] !== $a2[$indexB]) { 34 | $indexA = $indexB; 35 | echo "Expected ($this->lastFilename, line $indexB):\n\n"; 36 | while ($indexB < count($b2) && ( 37 | $indexB >= count($a2) || 38 | $b2[$indexB] !== $a2[$indexB])) { 39 | echo "|".$b2[$indexB++]."|\n"; 40 | } 41 | 42 | echo "\n\nGot:\n\n"; 43 | while ($indexA < count($a2) && $indexA < $indexB) { 44 | echo "|".$a2[$indexA++]."|\n"; 45 | } 46 | 47 | echo "\n\n"; 48 | } 49 | } 50 | 51 | if ($indexA < count($a2)) { 52 | echo "\n\nGot trailing lines vs $this->lastFilename:\n\n"; 53 | while ($indexA < count($a2)) { 54 | echo "|".$a2[$indexA++]."|\n"; 55 | } 56 | echo "\n\n"; 57 | } 58 | 59 | throw new HJSONException(); 60 | } 61 | } 62 | 63 | public function setUp() 64 | { 65 | $this->rootDir = dirname(__FILE__).DIRECTORY_SEPARATOR."assets"; 66 | $this->lastFilename = ''; 67 | } 68 | 69 | private function load($file, $cr) 70 | { 71 | $this->lastFilename = $file; 72 | $text = file_get_contents($this->rootDir.DIRECTORY_SEPARATOR.$file); 73 | $std = mb_ereg_replace('/\r/', "", $text); // make sure we have unix style text regardless of the input 74 | return $cr ? mb_ereg_replace("\n", "\r\n", $std) : $std; 75 | } 76 | 77 | private function runEach($name, $file, $isJson, $inputCr, $outputCr) 78 | { 79 | echo "Running test for $name, $file, ".(+$isJson).', '.(+$inputCr).', '.(+$outputCr)."\n"; 80 | $text = $this->load($file, $inputCr); 81 | $shouldFail = substr($name, 0, 4) === "fail"; 82 | $unexpectedPass = false; 83 | 84 | try { 85 | $parser = new HJSONParser(); 86 | $data = $parser->parse($text); 87 | 88 | $arrayData = $parser->parse($text, ['assoc' => true]); 89 | $this->assertEquals($arrayData, json_decode(json_encode($data), true)); 90 | 91 | if (!$shouldFail) { 92 | if ($isJson) { 93 | // compare Hjson parse to JSON parse 94 | $json1 = json_encode($data); 95 | $json2 = json_encode(json_decode($text)); 96 | $this->assertEquals($json1, $json2); 97 | } 98 | 99 | $text1 = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); 100 | $stringifier = new HJSONStringifier(); 101 | $hjson1 = $stringifier->stringify($data, [ 102 | 'eol' => $outputCr ? "\r\n" : "\n", 103 | 'emitRootBraces' => true, 104 | 'space' => 2 105 | ]).($outputCr ? "\r" : "")."\n"; 106 | $result = json_decode($this->load("{$name}_result.json", $inputCr)); 107 | $text2 = json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); 108 | $this->assertEquals($text1, $text2); 109 | $hjson2 = $this->load("{$name}_result.hjson", $outputCr); 110 | $this->assertEquals($hjson1, $hjson2); 111 | } else { 112 | $unexpectedPass = true; 113 | } 114 | } catch (HJSONException $e) { 115 | if (!$shouldFail) { 116 | echo "\n$e\n"; 117 | throw $e; 118 | } 119 | } 120 | 121 | if ($unexpectedPass) { 122 | echo "This test succeeded on data that should fail.\n"; 123 | throw new HJSONException(); 124 | } 125 | } 126 | 127 | public function testAll() 128 | { 129 | $hasFailure = false; 130 | $files = array_diff(scandir($this->rootDir), ['..', '.']); 131 | foreach ($files as $file) { 132 | $name = explode('_test.', $file); 133 | if (count($name) < 2) { 134 | continue; 135 | } 136 | $isJson = $name[1] === "json"; 137 | $name = $name[0]; 138 | 139 | // skip empty test, empty keys are not supported by PHP 140 | if ($name === "empty") { 141 | continue; 142 | } 143 | 144 | try { 145 | $this->runEach($name, $file, $isJson, false, false); 146 | } catch (HJSONException $e) { 147 | $hasFailure = true; 148 | } 149 | try { 150 | $this->runEach($name, $file, $isJson, false, true); 151 | } catch (HJSONException $e) { 152 | $hasFailure = true; 153 | } 154 | try { 155 | $this->runEach($name, $file, $isJson, true, false); 156 | } catch (HJSONException $e) { 157 | $hasFailure = true; 158 | } 159 | try { 160 | $this->runEach($name, $file, $isJson, true, true); 161 | } catch (HJSONException $e) { 162 | $hasFailure = true; 163 | } 164 | } 165 | 166 | if ($hasFailure) { 167 | exit(1); 168 | } 169 | } 170 | } 171 | 172 | $tester = new HJSONParserTest(); 173 | $tester->setUp(); 174 | $tester->testAll(); 175 | -------------------------------------------------------------------------------- /src/HJSON/HJSONStringifier.php: -------------------------------------------------------------------------------- 1 | meta = [ 42 | "\t" => "\\t", 43 | "\n" => "\\n", 44 | "\r" => "\\r", 45 | '"' => '\\"', 46 | '\'' => '\\\'', 47 | '\\' => "\\\\" 48 | ]; 49 | $this->meta[chr(8)] = '\\b'; 50 | $this->meta[chr(12)] = '\\f'; 51 | } 52 | 53 | 54 | public function stringify($value, $opt = []) 55 | { 56 | $this->eol = PHP_EOL; 57 | $this->indent = ' '; 58 | $this->keepWsc = false; 59 | $this->bracesSameLine = $this->defaultBracesSameLine; 60 | $this->quoteAlways = false; 61 | $this->forceKeyQuotes = false; 62 | $this->emitRootBraces = true; 63 | $space = null; 64 | 65 | if ($opt && is_array($opt)) { 66 | if (@$opt['eol'] === "\n" || @$opt['eol'] === "\r\n") { 67 | $this->eol = $opt['eol']; 68 | } 69 | $space = @$opt['space']; 70 | $this->keepWsc = @$opt['keepWsc']; 71 | $this->bracesSameLine = @$opt['bracesSameLine'] || $this->defaultBracesSameLine; 72 | $this->emitRootBraces = @$opt['emitRootBraces']; 73 | $this->quoteAlways = @$opt['quotes'] === 'always'; 74 | $this->forceKeyQuotes = @$opt['keyQuotes'] === 'always'; 75 | } 76 | 77 | // If the space parameter is a number, make an indent string containing that 78 | // many spaces. If it is a string, it will be used as the indent string. 79 | if (is_int($space)) { 80 | $this->indent = ''; 81 | for ($i = 0; $i < $space; $i++) { 82 | $this->indent .= ' '; 83 | } 84 | } elseif (is_string($space)) { 85 | $this->indent = $space; 86 | } 87 | 88 | // Return the result of stringifying the value. 89 | return $this->str($value, null, true, true); 90 | } 91 | 92 | public function stringifyWsc($value, $opt = []) 93 | { 94 | return $this->stringify($value, array_merge($opt, ['keepWsc' => true])); 95 | } 96 | 97 | private function isWhite($c) 98 | { 99 | return $c <= ' '; 100 | } 101 | 102 | private function quoteReplace($string) 103 | { 104 | $chars = mb_str_split($string); 105 | $chars = array_map(function ($char) { 106 | if (preg_match($this->needsEscape, $char)) { 107 | $a = $char; 108 | $c = @$this->meta[$a] ?: null; 109 | if (gettype($c) === 'string') { 110 | return $c; 111 | } else { 112 | return substr(json_encode($char), 1, -1); 113 | } 114 | } else { 115 | return $char; 116 | } 117 | }, $chars); 118 | 119 | return implode('', $chars); 120 | } 121 | 122 | private function quote($string = null, $gap = null, $hasComment = null, $isRootObject = null) 123 | { 124 | if ($string === '' || $string === null) { 125 | return '""'; 126 | } 127 | 128 | // Check if we can insert this string without quotes 129 | // see hjson syntax (must not parse as true, false, null or number) 130 | if ($this->quoteAlways || $hasComment || 131 | preg_match($this->needsQuotes, $string) || 132 | HJSONUtils::tryParseNumber($string, true) !== null || 133 | preg_match($this->startsWithKeyword, $string)) { 134 | // If the string contains no control characters, no quote characters, and no 135 | // backslash characters, then we can safely slap some quotes around it. 136 | // Otherwise we first check if the string can be expressed in multiline 137 | // format or we must replace the offending characters with safe escape 138 | // sequences. 139 | 140 | if (!preg_match($this->needsEscape, $string)) { 141 | return '"' . $string . '"'; 142 | } elseif (!preg_match($this->needsEscapeML, $string) && !$isRootObject) { 143 | return $this->mlString($string, $gap); 144 | } else { 145 | return '"' . $this->quoteReplace($string) . '"'; 146 | } 147 | } else { 148 | // return without quotes 149 | return $string; 150 | } 151 | } 152 | 153 | private function mlString($string, $gap) 154 | { 155 | // wrap the string into the ''' (multiline) format 156 | 157 | $a = explode("\n", mb_ereg_replace("\r", "", $string)); 158 | $gap .= $this->indent; 159 | 160 | if (count($a) === 1) { 161 | // The string contains only a single line. We still use the multiline 162 | // format as it avoids escaping the \ character (e.g. when used in a 163 | // regex). 164 | return "'''" . $a[0] . "'''"; 165 | } else { 166 | $res = $this->eol . $gap . "'''"; 167 | for ($i = 0; $i < count($a); $i++) { 168 | $res .= $this->eol; 169 | if ($a[$i] !== '') { 170 | $res .= $gap . $a[$i]; 171 | } 172 | } 173 | return $res . $this->eol . $gap . "'''"; 174 | } 175 | } 176 | 177 | private function quoteName($name) 178 | { 179 | if ($name === '') { 180 | return '""'; 181 | } 182 | 183 | // Check if we can insert this name without quotes 184 | if (preg_match($this->needsEscapeName, $name)) { 185 | return '"' . (preg_match($this->needsEscape, $name) ? $this->quoteReplace($name) : $name) . '"'; 186 | } else { 187 | // return without quotes 188 | return $name; 189 | } 190 | } 191 | 192 | private function str($value, $hasComment = null, $noIndent = null, $isRootObject = null) 193 | { 194 | // Produce a string from value. 195 | 196 | $startsWithNL = function ($str) { 197 | return $str && $str[$str[0] === "\r" ? 1 : 0] === "\n"; 198 | }; 199 | $testWsc = function ($str) use ($startsWithNL) { 200 | return $str && !$startsWithNL($str); 201 | }; 202 | $wsc = function ($str) { 203 | if ($str === '') { 204 | return ""; 205 | } 206 | for ($i = 0; $i < mb_strlen($str); $i++) { 207 | $c = $str[$i]; 208 | if ($c === "\n" || 209 | $c === '#' || 210 | $c === '/' && ($str[$i+1] === '/' || $str[$i+1] === '*')) { 211 | break; 212 | } 213 | if ($c > ' ') { 214 | return ' # ' . $str; 215 | } 216 | } 217 | return $str; 218 | }; 219 | 220 | // What happens next depends on the value's type. 221 | switch (gettype($value)) { 222 | case 'string': 223 | $str = $this->quote($value, $this->gap, $hasComment, $isRootObject); 224 | return $str; 225 | 226 | case 'integer': 227 | case 'double': 228 | return is_numeric($value) ? str_replace('E', 'e', "$value") : 'null'; 229 | 230 | case 'boolean': 231 | return $value ? 'true' : 'false'; 232 | 233 | case 'NULL': 234 | return 'null'; 235 | 236 | case 'object': 237 | case 'array': 238 | $isArray = is_array($value); 239 | 240 | $isAssocArray = function (array $arr) { 241 | if (array() === $arr) { 242 | return false; 243 | } 244 | return array_keys($arr) !== range(0, count($arr) - 1); 245 | }; 246 | if ($isArray && $isAssocArray($value)) { 247 | $value = (object) $value; 248 | $isArray = false; 249 | } 250 | 251 | $kw = null; 252 | $kwl = null; // whitespace & comments 253 | if ($this->keepWsc) { 254 | if ($isArray) { 255 | $kw = @$value['__WSC__']; 256 | } else { 257 | $kw = @$value->__WSC__; 258 | } 259 | } 260 | 261 | $showBraces = $isArray || !$isRootObject || ($kw ? !@$kw->noRootBraces : $this->emitRootBraces); 262 | 263 | // Make an array to hold the partial results of stringifying this object value. 264 | $mind = $this->gap; 265 | if ($showBraces) { 266 | $this->gap .= $this->indent; 267 | } 268 | $eolMind = $this->eol . $mind; 269 | $eolGap = $this->eol . $this->gap; 270 | $prefix = $noIndent || $this->bracesSameLine ? '' : $eolMind; 271 | $partial = []; 272 | 273 | $k; 274 | $v; // key, value 275 | 276 | if ($isArray) { 277 | // The value is an array. Stringify every element. Use null as a placeholder 278 | // for non-JSON values. 279 | 280 | $length = count($value); 281 | if (array_key_exists('__WSC__', $value)) { 282 | $length--; 283 | } 284 | 285 | for ($i = 0; $i < $length; $i++) { 286 | if ($kw) { 287 | $partial[] = $wsc(@$kw[$i]) . $eolGap; 288 | } 289 | $str = $this->str($value[$i], $kw ? $testWsc(@$kw[$i+1]) : false, true); 290 | $partial[] = $str !== null ? $str : 'null'; 291 | } 292 | if ($kw) { 293 | $partial[] = $wsc(@$kw[$i]) . $eolMind; 294 | } 295 | 296 | // Join all of the elements together, separated with newline, and wrap them in 297 | // brackets. 298 | if ($kw) { 299 | $v = $prefix . '[' . implode('', $partial) . ']'; 300 | } elseif (count($partial) === 0) { 301 | $v = '[]'; 302 | } else { 303 | $v = $prefix . '[' . $eolGap . implode($eolGap, $partial) . $eolMind . ']'; 304 | } 305 | } else { 306 | // Otherwise, iterate through all of the keys in the object. 307 | 308 | if ($kw) { 309 | $emptyKey = " "; 310 | $kwl = $wsc($kw->c->$emptyKey); 311 | $keys = $kw->o; 312 | foreach ($value as $k => $vvv) { 313 | $keys[] = $k; 314 | } 315 | $keys = array_unique($keys); 316 | 317 | for ($i = 0, $length = count($keys); $i < $length; $i++) { 318 | $k = $keys[$i]; 319 | if ($k === '__WSC__') { 320 | continue; 321 | } 322 | if ($showBraces || $i>0 || $kwl) { 323 | $partial[] = $kwl . $eolGap; 324 | } 325 | $kwl = $wsc($kw->c->$k); 326 | $v = $this->str($value->$k, $testWsc($kwl)); 327 | if ($v !== null) { 328 | $partial[] = $this->quoteName($k) . ($startsWithNL($v) ? ':' : ': ') . $v; 329 | } 330 | } 331 | if ($showBraces || $kwl) { 332 | $partial[] = $kwl . $eolMind; 333 | } 334 | } else { 335 | foreach ($value as $k => $vvv) { 336 | $v = $this->str($vvv); 337 | if ($v !== null) { 338 | $partial[] = $this->quoteName($k) . ($startsWithNL($v) ? ':' : ': ') . $v; 339 | } 340 | } 341 | } 342 | 343 | // Join all of the member texts together, separated with newlines 344 | if (count($partial) === 0) { 345 | $v = '{}'; 346 | } elseif ($showBraces) { 347 | // and wrap them in braces 348 | if ($kw) { 349 | $v = $prefix . '{' . implode('', $partial) . '}'; 350 | } else { 351 | $v = $prefix . '{' . $eolGap . implode($eolGap, $partial) . $eolMind . '}'; 352 | } 353 | } else { 354 | $v = implode($kw ? '' : $eolGap, $partial); 355 | } 356 | } 357 | 358 | $this->gap = $mind; 359 | return $v; 360 | } 361 | } 362 | } 363 | -------------------------------------------------------------------------------- /src/HJSON/HJSONParser.php: -------------------------------------------------------------------------------- 1 | escapee = [ 20 | '"' => '"', 21 | '\'' => '\'', 22 | "\\" => "\\", 23 | '/' => '/', 24 | 'b' => chr(8), 25 | 'f' => chr(12), 26 | 'n' => "\n", 27 | 'r' => "\r", 28 | 't' => "\t" 29 | ]; 30 | } 31 | 32 | public function parse($source, $options = []) 33 | { 34 | $this->keepWsc = $options && isset($options['keepWsc']) && $options['keepWsc']; 35 | $this->textArray = preg_split("//u", $source, -1, PREG_SPLIT_NO_EMPTY); 36 | $this->textLengthChars = count($this->textArray); 37 | 38 | $data = $this->rootValue(); 39 | 40 | if ($options && isset($options['assoc']) && $options['assoc']) { 41 | $data = json_decode(json_encode($data), true); 42 | } 43 | 44 | return $data; 45 | } 46 | 47 | private function resetAt() 48 | { 49 | $this->nestingDepth = 0; 50 | $this->at = 0; 51 | $this->ch = ' '; 52 | } 53 | 54 | public function parseWsc($source, $options = []) 55 | { 56 | return $this->parse($source, array_merge($options, ['keepWsc' => true])); 57 | } 58 | 59 | private function isPunctuatorChar($c) 60 | { 61 | return $c === '{' || $c === '}' || $c === '[' || $c === ']' || $c === ',' || $c === ':'; 62 | } 63 | 64 | private function checkExit($result) 65 | { 66 | $this->white(); 67 | if ($this->ch !== null) { 68 | $this->error("Syntax error, found trailing characters!"); 69 | } 70 | return $result; 71 | } 72 | 73 | private function rootValue() 74 | { 75 | // Braces for the root object are optional 76 | 77 | $this->resetAt(); 78 | $this->white(); 79 | switch ($this->ch) { 80 | case '{': 81 | return $this->checkExit($this->object()); 82 | case '[': 83 | return $this->checkExit($this->_array()); 84 | } 85 | 86 | try { 87 | // assume we have a root object without braces 88 | return $this->checkExit($this->object(true)); 89 | } catch (HJSONException $e) { 90 | // test if we are dealing with a single JSON value instead (true/false/null/num/"") 91 | $this->resetAt(); 92 | try { 93 | return $this->checkExit($this->value()); 94 | } catch (HJSONException $e2) { 95 | throw $e; 96 | } // throw original error 97 | } 98 | } 99 | 100 | private function value() 101 | { 102 | $this->white(); 103 | switch ($this->ch) { 104 | case '{': 105 | $this->nestingDepth++; 106 | $ret = $this->object(); 107 | $this->nestingDepth--; 108 | return $ret; 109 | case '[': 110 | $this->nestingDepth++; 111 | $ret = $this->_array(); 112 | $this->nestingDepth--; 113 | return $ret; 114 | case '"': 115 | return $this->string('"'); 116 | case '\'': 117 | if ($this->peek(0) !== '\'' || $this->peek(1) !== '\'') { 118 | return $this->string('\''); 119 | } 120 | // Falls through on multiline strings 121 | default: 122 | return $this->tfnns(); 123 | } 124 | } 125 | 126 | private function string($quote) 127 | { 128 | // Parse a string value. 129 | $hex; 130 | $string = ''; 131 | $uffff; 132 | 133 | // When parsing for string values, we must look for " and \ characters. 134 | if ($this->ch === $quote) { 135 | while ($this->next() !== null) { 136 | if ($this->ch === $quote) { 137 | $this->next(); 138 | return $string; 139 | } 140 | if ($this->ch === "\\") { 141 | $this->next(); 142 | if ($this->ch === 'u') { 143 | $uffff = ''; 144 | for ($i = 0; $i < 4; $i++) { 145 | $uffff .= $this->next(); 146 | } 147 | if (!ctype_xdigit($uffff)) { 148 | $this->error("Bad \\u char"); 149 | } 150 | $string .= mb_convert_encoding(pack('H*', $uffff), 'UTF-8', 'UTF-16BE'); 151 | } elseif (@$this->escapee[$this->ch]) { 152 | $string .= $this->escapee[$this->ch]; 153 | } else { 154 | break; 155 | } 156 | } else { 157 | $string .= $this->ch; 158 | } 159 | } 160 | } 161 | $this->error("Bad string"); 162 | } 163 | 164 | private function _array() 165 | { 166 | // Parse an array value. 167 | // assumeing ch === '[' 168 | 169 | if ($this->nestingDepth > $this->maxNestingDepth) { 170 | $this->error("Exceeded max depth (".$this->maxNestingDepth.")"); 171 | } 172 | 173 | $array = []; 174 | $kw = null; 175 | $wat = null; 176 | 177 | if ($this->keepWsc) { 178 | $array['__WSC__'] = []; 179 | $kw = &$array['__WSC__']; 180 | } 181 | 182 | $this->next(); 183 | $wat = $this->at; 184 | $this->white(); 185 | if ($kw !== null) { 186 | $c = $this->getComment($wat); 187 | if (trim($c) !== '') { 188 | $kw[] = $c; 189 | } 190 | } 191 | 192 | if ($this->ch === ']') { 193 | $this->next(); 194 | return $array; // empty array 195 | } 196 | 197 | while ($this->ch !== null) { 198 | $array[] = $this->value(); 199 | $wat = $this->at; 200 | $this->white(); 201 | // in Hjson the comma is optional and trailing commas are allowed 202 | if ($this->ch === ',') { 203 | $this->next(); 204 | $wat = $this->at; 205 | $this->white(); 206 | } 207 | if ($kw !== null) { 208 | $c = $this->getComment($wat); 209 | if (trim($c) !== '') { 210 | $kw[] = $c; 211 | } 212 | } 213 | if ($this->ch === ']') { 214 | $this->next(); 215 | return $array; 216 | } 217 | $this->white(); 218 | } 219 | 220 | $this->error("End of input while parsing an array (did you forget a closing ']'?)"); 221 | } 222 | 223 | private function object($withoutBraces = false) 224 | { 225 | // Parse an object value. 226 | 227 | if ($this->nestingDepth > $this->maxNestingDepth) { 228 | $this->error("Exceeded max depth (".$this->maxNestingDepth.")"); 229 | } 230 | 231 | $key = null; 232 | $object = new \stdClass(); 233 | $kw = null; 234 | $wat = null; 235 | if ($this->keepWsc) { 236 | $kw = new \stdClass(); 237 | $kw->c = new \stdClass(); 238 | $kw->o = []; 239 | $object->__WSC__ = $kw; 240 | if ($withoutBraces) { 241 | $kw->noRootBraces = true; 242 | } 243 | } 244 | 245 | if (!$withoutBraces) { 246 | // assuming ch === '{' 247 | $this->next(); 248 | $wat = $this->at; 249 | } else { 250 | $wat = 1; 251 | } 252 | 253 | $this->white(); 254 | if ($kw) { 255 | $this->pushWhite(" ", $kw, $wat); 256 | } 257 | if ($this->ch === '}' && !$withoutBraces) { 258 | $this->next(); 259 | return $object; // empty object 260 | } 261 | while ($this->ch !== null) { 262 | $key = $this->keyname(); 263 | $this->white(); 264 | $this->next(':'); 265 | // duplicate keys overwrite the previous value 266 | if ($key !== '') { 267 | $object->$key = $this->value(); 268 | } 269 | $wat = $this->at; 270 | $this->white(); 271 | // in Hjson the comma is optional and trailing commas are allowed 272 | if ($this->ch === ',') { 273 | $this->next(); 274 | $wat = $this->at; 275 | $this->white(); 276 | } 277 | if ($kw) { 278 | $this->pushWhite($key, $kw, $wat); 279 | } 280 | if ($this->ch === '}' && !$withoutBraces) { 281 | $this->next(); 282 | return $object; 283 | } 284 | $this->white(); 285 | } 286 | 287 | if ($withoutBraces) { 288 | return $object; 289 | } else { 290 | $this->error("End of input while parsing an object (did you forget a closing '}'?)"); 291 | } 292 | } 293 | 294 | private function pushWhite($key, &$kw, $wat) 295 | { 296 | $kw->c->$key = $this->getComment($wat); 297 | if (trim($key) !== '') { 298 | $kw->o[] = $key; 299 | } 300 | } 301 | 302 | private function white() 303 | { 304 | while ($this->ch !== null) { 305 | // Skip whitespace. 306 | while ($this->ch && $this->ch <= ' ') { 307 | $this->next(); 308 | } 309 | // Hjson allows comments 310 | if ($this->ch === '#' || $this->ch === '/' && $this->peek(0) === '/') { 311 | while ($this->ch !== null && $this->ch !== "\n") { 312 | $this->next(); 313 | } 314 | } elseif ($this->ch === '/' && $this->peek(0) === '*') { 315 | $this->next(); 316 | $this->next(); 317 | while ($this->ch !== null && !($this->ch === '*' && $this->peek(0) === '/')) { 318 | $this->next(); 319 | } 320 | if ($this->ch !== null) { 321 | $this->next(); 322 | $this->next(); 323 | } 324 | } else { 325 | break; 326 | } 327 | } 328 | } 329 | 330 | private function error($m) 331 | { 332 | $col=0; 333 | $colBytes = 0; 334 | $line=1; 335 | 336 | // Start with where we're at now, count back to most recent line break 337 | // - to determine "column" of error hit 338 | $i = $this->at; 339 | while ($i > 0) { 340 | // Mimic old behavior with mb_substr 341 | if ($i >= $this->textLengthChars) { 342 | $ch = ""; 343 | } else { 344 | $ch = $this->textArray[$i]; 345 | } 346 | 347 | --$i; 348 | if ($ch === "\n") { 349 | break; 350 | } 351 | 352 | $col++; 353 | } 354 | 355 | // Count back line endings from there to determine line# of error hit 356 | for (; $i > 0; $i--) { 357 | if ($this->textArray[$i] === "\n") { 358 | $line++; 359 | } 360 | } 361 | 362 | throw new HJSONException("$m at line $line, $col >>>". implode(array_slice($this->textArray, $this->at - $col, 20)) ." ..."); 363 | } 364 | 365 | private function next($c = false) 366 | { 367 | // If a c parameter is provided, verify that it matches the current character. 368 | 369 | if ($c !== false && $c !== $this->ch) { 370 | $this->error("Expected '$c' instead of '{$this->ch}'"); 371 | } 372 | 373 | // Get the next character. When there are no more characters, 374 | // return the empty string. 375 | $this->ch = ($this->textLengthChars > $this->at) ? $this->textArray[$this->at] : null; 376 | ++$this->at; 377 | return $this->ch; 378 | } 379 | 380 | /** 381 | * Peek at character at given offset from current "at" 382 | * - >=0 - ahead of "at" 383 | * - <0 = before "at" 384 | */ 385 | private function peek($offs) 386 | { 387 | $index = $this->at + $offs; 388 | 389 | if ($index < 0) { 390 | return null; 391 | } 392 | if ($index >= $this->textLengthChars) { 393 | return ""; 394 | } 395 | 396 | return $this->textArray[$index]; 397 | } 398 | 399 | private function skipIndent($indent) 400 | { 401 | $skip = $indent; 402 | while ($this->ch && $this->ch <= ' ' && $this->ch !== "\n" && $skip-- > 0) { 403 | $this->next(); 404 | } 405 | } 406 | 407 | private function mlString() 408 | { 409 | // Parse a multiline string value. 410 | $string = ''; 411 | $triple = 0; 412 | 413 | // we are at ''' +1 - get indent 414 | $indent = 0; 415 | while (true) { 416 | $c = $this->peek(-$indent-5); 417 | if ($c === null || $c === "\n") { 418 | break; 419 | } 420 | $indent++; 421 | } 422 | 423 | // skip white/to (newline) 424 | while ($this->ch !== null && $this->ch <= ' ' && $this->ch !== "\n") { 425 | $this->next(); 426 | } 427 | if ($this->ch === "\n") { 428 | $this->next(); 429 | $this->skipIndent($indent); 430 | } 431 | 432 | // When parsing multiline string values, we must look for ' characters. 433 | while (true) { 434 | if ($this->ch === null) { 435 | $this->error("Bad multiline string"); 436 | } elseif ($this->ch === '\'') { 437 | $triple++; 438 | $this->next(); 439 | if ($triple === 3) { 440 | if (substr($string, -1) === "\n") { 441 | $string = mb_substr($string, 0, -1); // remove last EOL 442 | } 443 | return $string; 444 | } else { 445 | continue; 446 | } 447 | } else { 448 | while ($triple > 0) { 449 | $string .= '\''; 450 | $triple--; 451 | } 452 | } 453 | if ($this->ch === "\n") { 454 | $string .= "\n"; 455 | $this->next(); 456 | $this->skipIndent($indent); 457 | } else { 458 | if ($this->ch !== "\r") { 459 | $string .= $this->ch; 460 | } 461 | $this->next(); 462 | } 463 | } 464 | } 465 | 466 | private function keyname() 467 | { 468 | // quotes for keys are optional in Hjson 469 | // unless they include {}[],: or whitespace. 470 | 471 | if ($this->ch === '"') { 472 | return $this->string('"'); 473 | } else if ($this->ch === '\'') { 474 | return $this->string('\''); 475 | } 476 | 477 | $name = ""; 478 | $start = $this->at; 479 | $space = -1; 480 | 481 | while (true) { 482 | if ($this->ch === ':') { 483 | if ($name === '') { 484 | $this->error("Found ':' but no key name (for an empty key name use quotes)"); 485 | } elseif ($space >=0 && $space !== mb_strlen($name)) { 486 | $this->at = $start + $space; 487 | $this->error("Found whitespace in your key name (use quotes to include)"); 488 | } 489 | return $name; 490 | } elseif ($this->ch <= ' ') { 491 | if (!$this->ch) { 492 | $this->error("Found EOF while looking for a key name (check your syntax)"); 493 | } elseif ($space < 0) { 494 | $space = mb_strlen($name); 495 | } 496 | } elseif ($this->isPunctuatorChar($this->ch)) { 497 | $this->error("Found '{$this->ch}' where a key name was expected (check your syntax or use quotes if the key name includes {}[],: or whitespace)"); 498 | } else { 499 | $name .= $this->ch; 500 | } 501 | $this->next(); 502 | } 503 | } 504 | 505 | private function tfnns() 506 | { 507 | // Hjson strings can be quoteless 508 | // returns string, true, false, or null. 509 | 510 | if ($this->isPunctuatorChar($this->ch)) { 511 | $this->error("Found a punctuator character '{$this->ch}' when expecting a quoteless string (check your syntax)"); 512 | } 513 | 514 | $value = $this->ch; 515 | while (true) { 516 | $isEol = $this->next() === null; 517 | if (mb_strlen($value) === 3 && $value === "'''") { 518 | return $this->mlString(); 519 | } 520 | $isEol = $isEol || $this->ch === "\r" || $this->ch === "\n"; 521 | 522 | if ($isEol || $this->ch === ',' || 523 | $this->ch === '}' || $this->ch === ']' || 524 | $this->ch === '#' || 525 | $this->ch === '/' && ($this->peek(0) === '/' || $this->peek(0) === '*') 526 | ) { 527 | $chf = $value[0]; 528 | switch ($chf) { 529 | case 'f': 530 | if (trim($value) === "false") { 531 | return false; 532 | } 533 | break; 534 | case 'n': 535 | if (trim($value) === "null") { 536 | return null; 537 | } 538 | break; 539 | case 't': 540 | if (trim($value) === "true") { 541 | return true; 542 | } 543 | break; 544 | default: 545 | if ($chf === '-' || $chf >= '0' && $chf <= '9') { 546 | $n = HJSONUtils::tryParseNumber($value); 547 | if ($n !== null) { 548 | return $n; 549 | } 550 | } 551 | } 552 | if ($isEol) { 553 | // remove any whitespace at the end (ignored in quoteless strings) 554 | return trim($value); 555 | } 556 | } 557 | $value .= $this->ch; 558 | } 559 | } 560 | 561 | private function getComment($wat) 562 | { 563 | $i; 564 | $wat--; 565 | // remove trailing whitespace 566 | for ($i = $this->at - 2; $i > $wat && $this->textArray[$i] <= ' ' && $this->textArray[$i] !== "\n"; $i--) { 567 | } 568 | 569 | // but only up to EOL 570 | if ($i > 0 && $this->textArray[$i] === "\n") { 571 | $i--; 572 | } 573 | if ($i > 0 && $this->textArray[$i] === "\r") { 574 | $i--; 575 | } 576 | 577 | $res = array_slice($this->textArray, $wat, $i-$wat+1); 578 | $res_len = count($res); 579 | for ($i = 0; $i < $res_len; $i++) { 580 | if ($res[$i] > ' ') { 581 | return $res; 582 | } 583 | } 584 | 585 | return ""; 586 | } 587 | } 588 | -------------------------------------------------------------------------------- /tests/assets/large_file_result.hjson: -------------------------------------------------------------------------------- 1 | { 2 | key1: 3 | { 4 | name: name1 5 | value: value1 6 | other: other1 7 | } 8 | key2: 9 | { 10 | name: name2 11 | value: value2 12 | other: other2 13 | } 14 | key3: 15 | { 16 | name: name3 17 | value: value3 18 | other: other3 19 | } 20 | key4: 21 | { 22 | name: name4 23 | value: value4 24 | other: other4 25 | } 26 | key5: 27 | { 28 | name: name5 29 | value: value5 30 | other: other5 31 | } 32 | key6: 33 | { 34 | name: name6 35 | value: value6 36 | other: other6 37 | } 38 | key7: 39 | { 40 | name: name7 41 | value: value7 42 | other: other7 43 | } 44 | key8: 45 | { 46 | name: name8 47 | value: value8 48 | other: other8 49 | } 50 | key9: 51 | { 52 | name: name9 53 | value: value9 54 | other: other9 55 | } 56 | key10: 57 | { 58 | name: name10 59 | value: value10 60 | other: other10 61 | } 62 | key11: 63 | { 64 | name: name11 65 | value: value11 66 | other: other11 67 | } 68 | key12: 69 | { 70 | name: name12 71 | value: value12 72 | other: other12 73 | } 74 | key13: 75 | { 76 | name: name13 77 | value: value13 78 | other: other13 79 | } 80 | key14: 81 | { 82 | name: name14 83 | value: value14 84 | other: other14 85 | } 86 | key15: 87 | { 88 | name: name15 89 | value: value15 90 | other: other15 91 | } 92 | key16: 93 | { 94 | name: name16 95 | value: value16 96 | other: other16 97 | } 98 | key17: 99 | { 100 | name: name17 101 | value: value17 102 | other: other17 103 | } 104 | key18: 105 | { 106 | name: name18 107 | value: value18 108 | other: other18 109 | } 110 | key19: 111 | { 112 | name: name19 113 | value: value19 114 | other: other19 115 | } 116 | key20: 117 | { 118 | name: name20 119 | value: value20 120 | other: other20 121 | } 122 | key21: 123 | { 124 | name: name21 125 | value: value21 126 | other: other21 127 | } 128 | key22: 129 | { 130 | name: name22 131 | value: value22 132 | other: other22 133 | } 134 | key23: 135 | { 136 | name: name23 137 | value: value23 138 | other: other23 139 | } 140 | key24: 141 | { 142 | name: name24 143 | value: value24 144 | other: other24 145 | } 146 | key25: 147 | { 148 | name: name25 149 | value: value25 150 | other: other25 151 | } 152 | key26: 153 | { 154 | name: name26 155 | value: value26 156 | other: other26 157 | } 158 | key27: 159 | { 160 | name: name27 161 | value: value27 162 | other: other27 163 | } 164 | key28: 165 | { 166 | name: name28 167 | value: value28 168 | other: other28 169 | } 170 | key29: 171 | { 172 | name: name29 173 | value: value29 174 | other: other29 175 | } 176 | key30: 177 | { 178 | name: name30 179 | value: value30 180 | other: other30 181 | } 182 | key31: 183 | { 184 | name: name31 185 | value: value31 186 | other: other31 187 | } 188 | key32: 189 | { 190 | name: name32 191 | value: value32 192 | other: other32 193 | } 194 | key33: 195 | { 196 | name: name33 197 | value: value33 198 | other: other33 199 | } 200 | key34: 201 | { 202 | name: name34 203 | value: value34 204 | other: other34 205 | } 206 | key35: 207 | { 208 | name: name35 209 | value: value35 210 | other: other35 211 | } 212 | key36: 213 | { 214 | name: name36 215 | value: value36 216 | other: other36 217 | } 218 | key37: 219 | { 220 | name: name37 221 | value: value37 222 | other: other37 223 | } 224 | key38: 225 | { 226 | name: name38 227 | value: value38 228 | other: other38 229 | } 230 | key39: 231 | { 232 | name: name39 233 | value: value39 234 | other: other39 235 | } 236 | key40: 237 | { 238 | name: name40 239 | value: value40 240 | other: other40 241 | } 242 | key41: 243 | { 244 | name: name41 245 | value: value41 246 | other: other41 247 | } 248 | key42: 249 | { 250 | name: name42 251 | value: value42 252 | other: other42 253 | } 254 | key43: 255 | { 256 | name: name43 257 | value: value43 258 | other: other43 259 | } 260 | key44: 261 | { 262 | name: name44 263 | value: value44 264 | other: other44 265 | } 266 | key45: 267 | { 268 | name: name45 269 | value: value45 270 | other: other45 271 | } 272 | key46: 273 | { 274 | name: name46 275 | value: value46 276 | other: other46 277 | } 278 | key47: 279 | { 280 | name: name47 281 | value: value47 282 | other: other47 283 | } 284 | key48: 285 | { 286 | name: name48 287 | value: value48 288 | other: other48 289 | } 290 | key49: 291 | { 292 | name: name49 293 | value: value49 294 | other: other49 295 | } 296 | key50: 297 | { 298 | name: name50 299 | value: value50 300 | other: other50 301 | } 302 | key51: 303 | { 304 | name: name51 305 | value: value51 306 | other: other51 307 | } 308 | key52: 309 | { 310 | name: name52 311 | value: value52 312 | other: other52 313 | } 314 | key53: 315 | { 316 | name: name53 317 | value: value53 318 | other: other53 319 | } 320 | key54: 321 | { 322 | name: name54 323 | value: value54 324 | other: other54 325 | } 326 | key55: 327 | { 328 | name: name55 329 | value: value55 330 | other: other55 331 | } 332 | key56: 333 | { 334 | name: name56 335 | value: value56 336 | other: other56 337 | } 338 | key57: 339 | { 340 | name: name57 341 | value: value57 342 | other: other57 343 | } 344 | key58: 345 | { 346 | name: name58 347 | value: value58 348 | other: other58 349 | } 350 | key59: 351 | { 352 | name: name59 353 | value: value59 354 | other: other59 355 | } 356 | key60: 357 | { 358 | name: name60 359 | value: value60 360 | other: other60 361 | } 362 | key61: 363 | { 364 | name: name61 365 | value: value61 366 | other: other61 367 | } 368 | key62: 369 | { 370 | name: name62 371 | value: value62 372 | other: other62 373 | } 374 | key63: 375 | { 376 | name: name63 377 | value: value63 378 | other: other63 379 | } 380 | key64: 381 | { 382 | name: name64 383 | value: value64 384 | other: other64 385 | } 386 | key65: 387 | { 388 | name: name65 389 | value: value65 390 | other: other65 391 | } 392 | key66: 393 | { 394 | name: name66 395 | value: value66 396 | other: other66 397 | } 398 | key67: 399 | { 400 | name: name67 401 | value: value67 402 | other: other67 403 | } 404 | key68: 405 | { 406 | name: name68 407 | value: value68 408 | other: other68 409 | } 410 | key69: 411 | { 412 | name: name69 413 | value: value69 414 | other: other69 415 | } 416 | key70: 417 | { 418 | name: name70 419 | value: value70 420 | other: other70 421 | } 422 | key71: 423 | { 424 | name: name71 425 | value: value71 426 | other: other71 427 | } 428 | key72: 429 | { 430 | name: name72 431 | value: value72 432 | other: other72 433 | } 434 | key73: 435 | { 436 | name: name73 437 | value: value73 438 | other: other73 439 | } 440 | key74: 441 | { 442 | name: name74 443 | value: value74 444 | other: other74 445 | } 446 | key75: 447 | { 448 | name: name75 449 | value: value75 450 | other: other75 451 | } 452 | key76: 453 | { 454 | name: name76 455 | value: value76 456 | other: other76 457 | } 458 | key77: 459 | { 460 | name: name77 461 | value: value77 462 | other: other77 463 | } 464 | key78: 465 | { 466 | name: name78 467 | value: value78 468 | other: other78 469 | } 470 | key79: 471 | { 472 | name: name79 473 | value: value79 474 | other: other79 475 | } 476 | key80: 477 | { 478 | name: name80 479 | value: value80 480 | other: other80 481 | } 482 | key81: 483 | { 484 | name: name81 485 | value: value81 486 | other: other81 487 | } 488 | key82: 489 | { 490 | name: name82 491 | value: value82 492 | other: other82 493 | } 494 | key83: 495 | { 496 | name: name83 497 | value: value83 498 | other: other83 499 | } 500 | key84: 501 | { 502 | name: name84 503 | value: value84 504 | other: other84 505 | } 506 | key85: 507 | { 508 | name: name85 509 | value: value85 510 | other: other85 511 | } 512 | key86: 513 | { 514 | name: name86 515 | value: value86 516 | other: other86 517 | } 518 | key87: 519 | { 520 | name: name87 521 | value: value87 522 | other: other87 523 | } 524 | key88: 525 | { 526 | name: name88 527 | value: value88 528 | other: other88 529 | } 530 | key89: 531 | { 532 | name: name89 533 | value: value89 534 | other: other89 535 | } 536 | key90: 537 | { 538 | name: name90 539 | value: value90 540 | other: other90 541 | } 542 | key91: 543 | { 544 | name: name91 545 | value: value91 546 | other: other91 547 | } 548 | key92: 549 | { 550 | name: name92 551 | value: value92 552 | other: other92 553 | } 554 | key93: 555 | { 556 | name: name93 557 | value: value93 558 | other: other93 559 | } 560 | key94: 561 | { 562 | name: name94 563 | value: value94 564 | other: other94 565 | } 566 | key95: 567 | { 568 | name: name95 569 | value: value95 570 | other: other95 571 | } 572 | key96: 573 | { 574 | name: name96 575 | value: value96 576 | other: other96 577 | } 578 | key97: 579 | { 580 | name: name97 581 | value: value97 582 | other: other97 583 | } 584 | key98: 585 | { 586 | name: name98 587 | value: value98 588 | other: other98 589 | } 590 | key99: 591 | { 592 | name: name99 593 | value: value99 594 | other: other99 595 | } 596 | key100: 597 | { 598 | name: name100 599 | value: value100 600 | other: other100 601 | } 602 | key101: 603 | { 604 | name: name101 605 | value: value101 606 | other: other101 607 | } 608 | key102: 609 | { 610 | name: name102 611 | value: value102 612 | other: other102 613 | } 614 | key103: 615 | { 616 | name: name103 617 | value: value103 618 | other: other103 619 | } 620 | key104: 621 | { 622 | name: name104 623 | value: value104 624 | other: other104 625 | } 626 | key105: 627 | { 628 | name: name105 629 | value: value105 630 | other: other105 631 | } 632 | key106: 633 | { 634 | name: name106 635 | value: value106 636 | other: other106 637 | } 638 | key107: 639 | { 640 | name: name107 641 | value: value107 642 | other: other107 643 | } 644 | key108: 645 | { 646 | name: name108 647 | value: value108 648 | other: other108 649 | } 650 | key109: 651 | { 652 | name: name109 653 | value: value109 654 | other: other109 655 | } 656 | key110: 657 | { 658 | name: name110 659 | value: value110 660 | other: other110 661 | } 662 | key111: 663 | { 664 | name: name111 665 | value: value111 666 | other: other111 667 | } 668 | key112: 669 | { 670 | name: name112 671 | value: value112 672 | other: other112 673 | } 674 | key113: 675 | { 676 | name: name113 677 | value: value113 678 | other: other113 679 | } 680 | key114: 681 | { 682 | name: name114 683 | value: value114 684 | other: other114 685 | } 686 | key115: 687 | { 688 | name: name115 689 | value: value115 690 | other: other115 691 | } 692 | key116: 693 | { 694 | name: name116 695 | value: value116 696 | other: other116 697 | } 698 | key117: 699 | { 700 | name: name117 701 | value: value117 702 | other: other117 703 | } 704 | key118: 705 | { 706 | name: name118 707 | value: value118 708 | other: other118 709 | } 710 | key119: 711 | { 712 | name: name119 713 | value: value119 714 | other: other119 715 | } 716 | key120: 717 | { 718 | name: name120 719 | value: value120 720 | other: other120 721 | } 722 | key121: 723 | { 724 | name: name121 725 | value: value121 726 | other: other121 727 | } 728 | key122: 729 | { 730 | name: name122 731 | value: value122 732 | other: other122 733 | } 734 | key123: 735 | { 736 | name: name123 737 | value: value123 738 | other: other123 739 | } 740 | key124: 741 | { 742 | name: name124 743 | value: value124 744 | other: other124 745 | } 746 | key125: 747 | { 748 | name: name125 749 | value: value125 750 | other: other125 751 | } 752 | key126: 753 | { 754 | name: name126 755 | value: value126 756 | other: other126 757 | } 758 | key127: 759 | { 760 | name: name127 761 | value: value127 762 | other: other127 763 | } 764 | key128: 765 | { 766 | name: name128 767 | value: value128 768 | other: other128 769 | } 770 | key129: 771 | { 772 | name: name129 773 | value: value129 774 | other: other129 775 | } 776 | key130: 777 | { 778 | name: name130 779 | value: value130 780 | other: other130 781 | } 782 | key131: 783 | { 784 | name: name131 785 | value: value131 786 | other: other131 787 | } 788 | key132: 789 | { 790 | name: name132 791 | value: value132 792 | other: other132 793 | } 794 | key133: 795 | { 796 | name: name133 797 | value: value133 798 | other: other133 799 | } 800 | key134: 801 | { 802 | name: name134 803 | value: value134 804 | other: other134 805 | } 806 | key135: 807 | { 808 | name: name135 809 | value: value135 810 | other: other135 811 | } 812 | key136: 813 | { 814 | name: name136 815 | value: value136 816 | other: other136 817 | } 818 | key137: 819 | { 820 | name: name137 821 | value: value137 822 | other: other137 823 | } 824 | key138: 825 | { 826 | name: name138 827 | value: value138 828 | other: other138 829 | } 830 | key139: 831 | { 832 | name: name139 833 | value: value139 834 | other: other139 835 | } 836 | key140: 837 | { 838 | name: name140 839 | value: value140 840 | other: other140 841 | } 842 | key141: 843 | { 844 | name: name141 845 | value: value141 846 | other: other141 847 | } 848 | key142: 849 | { 850 | name: name142 851 | value: value142 852 | other: other142 853 | } 854 | key143: 855 | { 856 | name: name143 857 | value: value143 858 | other: other143 859 | } 860 | key144: 861 | { 862 | name: name144 863 | value: value144 864 | other: other144 865 | } 866 | key145: 867 | { 868 | name: name145 869 | value: value145 870 | other: other145 871 | } 872 | key146: 873 | { 874 | name: name146 875 | value: value146 876 | other: other146 877 | } 878 | key147: 879 | { 880 | name: name147 881 | value: value147 882 | other: other147 883 | } 884 | key148: 885 | { 886 | name: name148 887 | value: value148 888 | other: other148 889 | } 890 | key149: 891 | { 892 | name: name149 893 | value: value149 894 | other: other149 895 | } 896 | key150: 897 | { 898 | name: name150 899 | value: value150 900 | other: other150 901 | } 902 | key151: 903 | { 904 | name: name151 905 | value: value151 906 | other: other151 907 | } 908 | key152: 909 | { 910 | name: name152 911 | value: value152 912 | other: other152 913 | } 914 | key153: 915 | { 916 | name: name153 917 | value: value153 918 | other: other153 919 | } 920 | key154: 921 | { 922 | name: name154 923 | value: value154 924 | other: other154 925 | } 926 | key155: 927 | { 928 | name: name155 929 | value: value155 930 | other: other155 931 | } 932 | key156: 933 | { 934 | name: name156 935 | value: value156 936 | other: other156 937 | } 938 | key157: 939 | { 940 | name: name157 941 | value: value157 942 | other: other157 943 | } 944 | key158: 945 | { 946 | name: name158 947 | value: value158 948 | other: other158 949 | } 950 | key159: 951 | { 952 | name: name159 953 | value: value159 954 | other: other159 955 | } 956 | key160: 957 | { 958 | name: name160 959 | value: value160 960 | other: other160 961 | } 962 | key161: 963 | { 964 | name: name161 965 | value: value161 966 | other: other161 967 | } 968 | key162: 969 | { 970 | name: name162 971 | value: value162 972 | other: other162 973 | } 974 | key163: 975 | { 976 | name: name163 977 | value: value163 978 | other: other163 979 | } 980 | key164: 981 | { 982 | name: name164 983 | value: value164 984 | other: other164 985 | } 986 | key165: 987 | { 988 | name: name165 989 | value: value165 990 | other: other165 991 | } 992 | key166: 993 | { 994 | name: name166 995 | value: value166 996 | other: other166 997 | } 998 | key167: 999 | { 1000 | name: name167 1001 | value: value167 1002 | other: other167 1003 | } 1004 | key168: 1005 | { 1006 | name: name168 1007 | value: value168 1008 | other: other168 1009 | } 1010 | key169: 1011 | { 1012 | name: name169 1013 | value: value169 1014 | other: other169 1015 | } 1016 | key170: 1017 | { 1018 | name: name170 1019 | value: value170 1020 | other: other170 1021 | } 1022 | key171: 1023 | { 1024 | name: name171 1025 | value: value171 1026 | other: other171 1027 | } 1028 | key172: 1029 | { 1030 | name: name172 1031 | value: value172 1032 | other: other172 1033 | } 1034 | key173: 1035 | { 1036 | name: name173 1037 | value: value173 1038 | other: other173 1039 | } 1040 | key174: 1041 | { 1042 | name: name174 1043 | value: value174 1044 | other: other174 1045 | } 1046 | key175: 1047 | { 1048 | name: name175 1049 | value: value175 1050 | other: other175 1051 | } 1052 | key176: 1053 | { 1054 | name: name176 1055 | value: value176 1056 | other: other176 1057 | } 1058 | key177: 1059 | { 1060 | name: name177 1061 | value: value177 1062 | other: other177 1063 | } 1064 | key178: 1065 | { 1066 | name: name178 1067 | value: value178 1068 | other: other178 1069 | } 1070 | key179: 1071 | { 1072 | name: name179 1073 | value: value179 1074 | other: other179 1075 | } 1076 | key180: 1077 | { 1078 | name: name180 1079 | value: value180 1080 | other: other180 1081 | } 1082 | key181: 1083 | { 1084 | name: name181 1085 | value: value181 1086 | other: other181 1087 | } 1088 | key182: 1089 | { 1090 | name: name182 1091 | value: value182 1092 | other: other182 1093 | } 1094 | key183: 1095 | { 1096 | name: name183 1097 | value: value183 1098 | other: other183 1099 | } 1100 | key184: 1101 | { 1102 | name: name184 1103 | value: value184 1104 | other: other184 1105 | } 1106 | key185: 1107 | { 1108 | name: name185 1109 | value: value185 1110 | other: other185 1111 | } 1112 | key186: 1113 | { 1114 | name: name186 1115 | value: value186 1116 | other: other186 1117 | } 1118 | key187: 1119 | { 1120 | name: name187 1121 | value: value187 1122 | other: other187 1123 | } 1124 | key188: 1125 | { 1126 | name: name188 1127 | value: value188 1128 | other: other188 1129 | } 1130 | key189: 1131 | { 1132 | name: name189 1133 | value: value189 1134 | other: other189 1135 | } 1136 | key190: 1137 | { 1138 | name: name190 1139 | value: value190 1140 | other: other190 1141 | } 1142 | key191: 1143 | { 1144 | name: name191 1145 | value: value191 1146 | other: other191 1147 | } 1148 | key192: 1149 | { 1150 | name: name192 1151 | value: value192 1152 | other: other192 1153 | } 1154 | key193: 1155 | { 1156 | name: name193 1157 | value: value193 1158 | other: other193 1159 | } 1160 | key194: 1161 | { 1162 | name: name194 1163 | value: value194 1164 | other: other194 1165 | } 1166 | key195: 1167 | { 1168 | name: name195 1169 | value: value195 1170 | other: other195 1171 | } 1172 | key196: 1173 | { 1174 | name: name196 1175 | value: value196 1176 | other: other196 1177 | } 1178 | key197: 1179 | { 1180 | name: name197 1181 | value: value197 1182 | other: other197 1183 | } 1184 | key198: 1185 | { 1186 | name: name198 1187 | value: value198 1188 | other: other198 1189 | } 1190 | key199: 1191 | { 1192 | name: name199 1193 | value: value199 1194 | other: other199 1195 | } 1196 | key200: 1197 | { 1198 | name: name200 1199 | value: value200 1200 | other: other200 1201 | } 1202 | key201: 1203 | { 1204 | name: name201 1205 | value: value201 1206 | other: other201 1207 | } 1208 | key202: 1209 | { 1210 | name: name202 1211 | value: value202 1212 | other: other202 1213 | } 1214 | key203: 1215 | { 1216 | name: name203 1217 | value: value203 1218 | other: other203 1219 | } 1220 | key204: 1221 | { 1222 | name: name204 1223 | value: value204 1224 | other: other204 1225 | } 1226 | key205: 1227 | { 1228 | name: name205 1229 | value: value205 1230 | other: other205 1231 | } 1232 | key206: 1233 | { 1234 | name: name206 1235 | value: value206 1236 | other: other206 1237 | } 1238 | key207: 1239 | { 1240 | name: name207 1241 | value: value207 1242 | other: other207 1243 | } 1244 | key208: 1245 | { 1246 | name: name208 1247 | value: value208 1248 | other: other208 1249 | } 1250 | key209: 1251 | { 1252 | name: name209 1253 | value: value209 1254 | other: other209 1255 | } 1256 | key210: 1257 | { 1258 | name: name210 1259 | value: value210 1260 | other: other210 1261 | } 1262 | key211: 1263 | { 1264 | name: name211 1265 | value: value211 1266 | other: other211 1267 | } 1268 | key212: 1269 | { 1270 | name: name212 1271 | value: value212 1272 | other: other212 1273 | } 1274 | key213: 1275 | { 1276 | name: name213 1277 | value: value213 1278 | other: other213 1279 | } 1280 | key214: 1281 | { 1282 | name: name214 1283 | value: value214 1284 | other: other214 1285 | } 1286 | key215: 1287 | { 1288 | name: name215 1289 | value: value215 1290 | other: other215 1291 | } 1292 | key216: 1293 | { 1294 | name: name216 1295 | value: value216 1296 | other: other216 1297 | } 1298 | key217: 1299 | { 1300 | name: name217 1301 | value: value217 1302 | other: other217 1303 | } 1304 | key218: 1305 | { 1306 | name: name218 1307 | value: value218 1308 | other: other218 1309 | } 1310 | key219: 1311 | { 1312 | name: name219 1313 | value: value219 1314 | other: other219 1315 | } 1316 | key220: 1317 | { 1318 | name: name220 1319 | value: value220 1320 | other: other220 1321 | } 1322 | key221: 1323 | { 1324 | name: name221 1325 | value: value221 1326 | other: other221 1327 | } 1328 | key222: 1329 | { 1330 | name: name222 1331 | value: value222 1332 | other: other222 1333 | } 1334 | key223: 1335 | { 1336 | name: name223 1337 | value: value223 1338 | other: other223 1339 | } 1340 | key224: 1341 | { 1342 | name: name224 1343 | value: value224 1344 | other: other224 1345 | } 1346 | key225: 1347 | { 1348 | name: name225 1349 | value: value225 1350 | other: other225 1351 | } 1352 | key226: 1353 | { 1354 | name: name226 1355 | value: value226 1356 | other: other226 1357 | } 1358 | key227: 1359 | { 1360 | name: name227 1361 | value: value227 1362 | other: other227 1363 | } 1364 | key228: 1365 | { 1366 | name: name228 1367 | value: value228 1368 | other: other228 1369 | } 1370 | key229: 1371 | { 1372 | name: name229 1373 | value: value229 1374 | other: other229 1375 | } 1376 | key230: 1377 | { 1378 | name: name230 1379 | value: value230 1380 | other: other230 1381 | } 1382 | key231: 1383 | { 1384 | name: name231 1385 | value: value231 1386 | other: other231 1387 | } 1388 | key232: 1389 | { 1390 | name: name232 1391 | value: value232 1392 | other: other232 1393 | } 1394 | key233: 1395 | { 1396 | name: name233 1397 | value: value233 1398 | other: other233 1399 | } 1400 | key234: 1401 | { 1402 | name: name234 1403 | value: value234 1404 | other: other234 1405 | } 1406 | key235: 1407 | { 1408 | name: name235 1409 | value: value235 1410 | other: other235 1411 | } 1412 | key236: 1413 | { 1414 | name: name236 1415 | value: value236 1416 | other: other236 1417 | } 1418 | key237: 1419 | { 1420 | name: name237 1421 | value: value237 1422 | other: other237 1423 | } 1424 | key238: 1425 | { 1426 | name: name238 1427 | value: value238 1428 | other: other238 1429 | } 1430 | key239: 1431 | { 1432 | name: name239 1433 | value: value239 1434 | other: other239 1435 | } 1436 | key240: 1437 | { 1438 | name: name240 1439 | value: value240 1440 | other: other240 1441 | } 1442 | key241: 1443 | { 1444 | name: name241 1445 | value: value241 1446 | other: other241 1447 | } 1448 | key242: 1449 | { 1450 | name: name242 1451 | value: value242 1452 | other: other242 1453 | } 1454 | key243: 1455 | { 1456 | name: name243 1457 | value: value243 1458 | other: other243 1459 | } 1460 | key244: 1461 | { 1462 | name: name244 1463 | value: value244 1464 | other: other244 1465 | } 1466 | key245: 1467 | { 1468 | name: name245 1469 | value: value245 1470 | other: other245 1471 | } 1472 | key246: 1473 | { 1474 | name: name246 1475 | value: value246 1476 | other: other246 1477 | } 1478 | key247: 1479 | { 1480 | name: name247 1481 | value: value247 1482 | other: other247 1483 | } 1484 | key248: 1485 | { 1486 | name: name248 1487 | value: value248 1488 | other: other248 1489 | } 1490 | key249: 1491 | { 1492 | name: name249 1493 | value: value249 1494 | other: other249 1495 | } 1496 | key250: 1497 | { 1498 | name: name250 1499 | value: value250 1500 | other: other250 1501 | } 1502 | key251: 1503 | { 1504 | name: name251 1505 | value: value251 1506 | other: other251 1507 | } 1508 | key252: 1509 | { 1510 | name: name252 1511 | value: value252 1512 | other: other252 1513 | } 1514 | key253: 1515 | { 1516 | name: name253 1517 | value: value253 1518 | other: other253 1519 | } 1520 | key254: 1521 | { 1522 | name: name254 1523 | value: value254 1524 | other: other254 1525 | } 1526 | key255: 1527 | { 1528 | name: name255 1529 | value: value255 1530 | other: other255 1531 | } 1532 | key256: 1533 | { 1534 | name: name256 1535 | value: value256 1536 | other: other256 1537 | } 1538 | key257: 1539 | { 1540 | name: name257 1541 | value: value257 1542 | other: other257 1543 | } 1544 | key258: 1545 | { 1546 | name: name258 1547 | value: value258 1548 | other: other258 1549 | } 1550 | key259: 1551 | { 1552 | name: name259 1553 | value: value259 1554 | other: other259 1555 | } 1556 | key260: 1557 | { 1558 | name: name260 1559 | value: value260 1560 | other: other260 1561 | } 1562 | key261: 1563 | { 1564 | name: name261 1565 | value: value261 1566 | other: other261 1567 | } 1568 | key262: 1569 | { 1570 | name: name262 1571 | value: value262 1572 | other: other262 1573 | } 1574 | key263: 1575 | { 1576 | name: name263 1577 | value: value263 1578 | other: other263 1579 | } 1580 | key264: 1581 | { 1582 | name: name264 1583 | value: value264 1584 | other: other264 1585 | } 1586 | key265: 1587 | { 1588 | name: name265 1589 | value: value265 1590 | other: other265 1591 | } 1592 | key266: 1593 | { 1594 | name: name266 1595 | value: value266 1596 | other: other266 1597 | } 1598 | key267: 1599 | { 1600 | name: name267 1601 | value: value267 1602 | other: other267 1603 | } 1604 | key268: 1605 | { 1606 | name: name268 1607 | value: value268 1608 | other: other268 1609 | } 1610 | key269: 1611 | { 1612 | name: name269 1613 | value: value269 1614 | other: other269 1615 | } 1616 | key270: 1617 | { 1618 | name: name270 1619 | value: value270 1620 | other: other270 1621 | } 1622 | key271: 1623 | { 1624 | name: name271 1625 | value: value271 1626 | other: other271 1627 | } 1628 | key272: 1629 | { 1630 | name: name272 1631 | value: value272 1632 | other: other272 1633 | } 1634 | key273: 1635 | { 1636 | name: name273 1637 | value: value273 1638 | other: other273 1639 | } 1640 | key274: 1641 | { 1642 | name: name274 1643 | value: value274 1644 | other: other274 1645 | } 1646 | key275: 1647 | { 1648 | name: name275 1649 | value: value275 1650 | other: other275 1651 | } 1652 | key276: 1653 | { 1654 | name: name276 1655 | value: value276 1656 | other: other276 1657 | } 1658 | key277: 1659 | { 1660 | name: name277 1661 | value: value277 1662 | other: other277 1663 | } 1664 | key278: 1665 | { 1666 | name: name278 1667 | value: value278 1668 | other: other278 1669 | } 1670 | key279: 1671 | { 1672 | name: name279 1673 | value: value279 1674 | other: other279 1675 | } 1676 | key280: 1677 | { 1678 | name: name280 1679 | value: value280 1680 | other: other280 1681 | } 1682 | key281: 1683 | { 1684 | name: name281 1685 | value: value281 1686 | other: other281 1687 | } 1688 | key282: 1689 | { 1690 | name: name282 1691 | value: value282 1692 | other: other282 1693 | } 1694 | key283: 1695 | { 1696 | name: name283 1697 | value: value283 1698 | other: other283 1699 | } 1700 | key284: 1701 | { 1702 | name: name284 1703 | value: value284 1704 | other: other284 1705 | } 1706 | key285: 1707 | { 1708 | name: name285 1709 | value: value285 1710 | other: other285 1711 | } 1712 | key286: 1713 | { 1714 | name: name286 1715 | value: value286 1716 | other: other286 1717 | } 1718 | key287: 1719 | { 1720 | name: name287 1721 | value: value287 1722 | other: other287 1723 | } 1724 | key288: 1725 | { 1726 | name: name288 1727 | value: value288 1728 | other: other288 1729 | } 1730 | key289: 1731 | { 1732 | name: name289 1733 | value: value289 1734 | other: other289 1735 | } 1736 | key290: 1737 | { 1738 | name: name290 1739 | value: value290 1740 | other: other290 1741 | } 1742 | key291: 1743 | { 1744 | name: name291 1745 | value: value291 1746 | other: other291 1747 | } 1748 | key292: 1749 | { 1750 | name: name292 1751 | value: value292 1752 | other: other292 1753 | } 1754 | key293: 1755 | { 1756 | name: name293 1757 | value: value293 1758 | other: other293 1759 | } 1760 | key294: 1761 | { 1762 | name: name294 1763 | value: value294 1764 | other: other294 1765 | } 1766 | key295: 1767 | { 1768 | name: name295 1769 | value: value295 1770 | other: other295 1771 | } 1772 | key296: 1773 | { 1774 | name: name296 1775 | value: value296 1776 | other: other296 1777 | } 1778 | key297: 1779 | { 1780 | name: name297 1781 | value: value297 1782 | other: other297 1783 | } 1784 | key298: 1785 | { 1786 | name: name298 1787 | value: value298 1788 | other: other298 1789 | } 1790 | key299: 1791 | { 1792 | name: name299 1793 | value: value299 1794 | other: other299 1795 | } 1796 | key300: 1797 | { 1798 | name: name300 1799 | value: value300 1800 | other: other300 1801 | } 1802 | } 1803 | -------------------------------------------------------------------------------- /tests/assets/large_file_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "key1": { 3 | "name": "name1", 4 | "value": "value1", 5 | "other": "other1" 6 | }, 7 | "key2": { 8 | "name": "name2", 9 | "value": "value2", 10 | "other": "other2" 11 | }, 12 | "key3": { 13 | "name": "name3", 14 | "value": "value3", 15 | "other": "other3" 16 | }, 17 | "key4": { 18 | "name": "name4", 19 | "value": "value4", 20 | "other": "other4" 21 | }, 22 | "key5": { 23 | "name": "name5", 24 | "value": "value5", 25 | "other": "other5" 26 | }, 27 | "key6": { 28 | "name": "name6", 29 | "value": "value6", 30 | "other": "other6" 31 | }, 32 | "key7": { 33 | "name": "name7", 34 | "value": "value7", 35 | "other": "other7" 36 | }, 37 | "key8": { 38 | "name": "name8", 39 | "value": "value8", 40 | "other": "other8" 41 | }, 42 | "key9": { 43 | "name": "name9", 44 | "value": "value9", 45 | "other": "other9" 46 | }, 47 | "key10": { 48 | "name": "name10", 49 | "value": "value10", 50 | "other": "other10" 51 | }, 52 | "key11": { 53 | "name": "name11", 54 | "value": "value11", 55 | "other": "other11" 56 | }, 57 | "key12": { 58 | "name": "name12", 59 | "value": "value12", 60 | "other": "other12" 61 | }, 62 | "key13": { 63 | "name": "name13", 64 | "value": "value13", 65 | "other": "other13" 66 | }, 67 | "key14": { 68 | "name": "name14", 69 | "value": "value14", 70 | "other": "other14" 71 | }, 72 | "key15": { 73 | "name": "name15", 74 | "value": "value15", 75 | "other": "other15" 76 | }, 77 | "key16": { 78 | "name": "name16", 79 | "value": "value16", 80 | "other": "other16" 81 | }, 82 | "key17": { 83 | "name": "name17", 84 | "value": "value17", 85 | "other": "other17" 86 | }, 87 | "key18": { 88 | "name": "name18", 89 | "value": "value18", 90 | "other": "other18" 91 | }, 92 | "key19": { 93 | "name": "name19", 94 | "value": "value19", 95 | "other": "other19" 96 | }, 97 | "key20": { 98 | "name": "name20", 99 | "value": "value20", 100 | "other": "other20" 101 | }, 102 | "key21": { 103 | "name": "name21", 104 | "value": "value21", 105 | "other": "other21" 106 | }, 107 | "key22": { 108 | "name": "name22", 109 | "value": "value22", 110 | "other": "other22" 111 | }, 112 | "key23": { 113 | "name": "name23", 114 | "value": "value23", 115 | "other": "other23" 116 | }, 117 | "key24": { 118 | "name": "name24", 119 | "value": "value24", 120 | "other": "other24" 121 | }, 122 | "key25": { 123 | "name": "name25", 124 | "value": "value25", 125 | "other": "other25" 126 | }, 127 | "key26": { 128 | "name": "name26", 129 | "value": "value26", 130 | "other": "other26" 131 | }, 132 | "key27": { 133 | "name": "name27", 134 | "value": "value27", 135 | "other": "other27" 136 | }, 137 | "key28": { 138 | "name": "name28", 139 | "value": "value28", 140 | "other": "other28" 141 | }, 142 | "key29": { 143 | "name": "name29", 144 | "value": "value29", 145 | "other": "other29" 146 | }, 147 | "key30": { 148 | "name": "name30", 149 | "value": "value30", 150 | "other": "other30" 151 | }, 152 | "key31": { 153 | "name": "name31", 154 | "value": "value31", 155 | "other": "other31" 156 | }, 157 | "key32": { 158 | "name": "name32", 159 | "value": "value32", 160 | "other": "other32" 161 | }, 162 | "key33": { 163 | "name": "name33", 164 | "value": "value33", 165 | "other": "other33" 166 | }, 167 | "key34": { 168 | "name": "name34", 169 | "value": "value34", 170 | "other": "other34" 171 | }, 172 | "key35": { 173 | "name": "name35", 174 | "value": "value35", 175 | "other": "other35" 176 | }, 177 | "key36": { 178 | "name": "name36", 179 | "value": "value36", 180 | "other": "other36" 181 | }, 182 | "key37": { 183 | "name": "name37", 184 | "value": "value37", 185 | "other": "other37" 186 | }, 187 | "key38": { 188 | "name": "name38", 189 | "value": "value38", 190 | "other": "other38" 191 | }, 192 | "key39": { 193 | "name": "name39", 194 | "value": "value39", 195 | "other": "other39" 196 | }, 197 | "key40": { 198 | "name": "name40", 199 | "value": "value40", 200 | "other": "other40" 201 | }, 202 | "key41": { 203 | "name": "name41", 204 | "value": "value41", 205 | "other": "other41" 206 | }, 207 | "key42": { 208 | "name": "name42", 209 | "value": "value42", 210 | "other": "other42" 211 | }, 212 | "key43": { 213 | "name": "name43", 214 | "value": "value43", 215 | "other": "other43" 216 | }, 217 | "key44": { 218 | "name": "name44", 219 | "value": "value44", 220 | "other": "other44" 221 | }, 222 | "key45": { 223 | "name": "name45", 224 | "value": "value45", 225 | "other": "other45" 226 | }, 227 | "key46": { 228 | "name": "name46", 229 | "value": "value46", 230 | "other": "other46" 231 | }, 232 | "key47": { 233 | "name": "name47", 234 | "value": "value47", 235 | "other": "other47" 236 | }, 237 | "key48": { 238 | "name": "name48", 239 | "value": "value48", 240 | "other": "other48" 241 | }, 242 | "key49": { 243 | "name": "name49", 244 | "value": "value49", 245 | "other": "other49" 246 | }, 247 | "key50": { 248 | "name": "name50", 249 | "value": "value50", 250 | "other": "other50" 251 | }, 252 | "key51": { 253 | "name": "name51", 254 | "value": "value51", 255 | "other": "other51" 256 | }, 257 | "key52": { 258 | "name": "name52", 259 | "value": "value52", 260 | "other": "other52" 261 | }, 262 | "key53": { 263 | "name": "name53", 264 | "value": "value53", 265 | "other": "other53" 266 | }, 267 | "key54": { 268 | "name": "name54", 269 | "value": "value54", 270 | "other": "other54" 271 | }, 272 | "key55": { 273 | "name": "name55", 274 | "value": "value55", 275 | "other": "other55" 276 | }, 277 | "key56": { 278 | "name": "name56", 279 | "value": "value56", 280 | "other": "other56" 281 | }, 282 | "key57": { 283 | "name": "name57", 284 | "value": "value57", 285 | "other": "other57" 286 | }, 287 | "key58": { 288 | "name": "name58", 289 | "value": "value58", 290 | "other": "other58" 291 | }, 292 | "key59": { 293 | "name": "name59", 294 | "value": "value59", 295 | "other": "other59" 296 | }, 297 | "key60": { 298 | "name": "name60", 299 | "value": "value60", 300 | "other": "other60" 301 | }, 302 | "key61": { 303 | "name": "name61", 304 | "value": "value61", 305 | "other": "other61" 306 | }, 307 | "key62": { 308 | "name": "name62", 309 | "value": "value62", 310 | "other": "other62" 311 | }, 312 | "key63": { 313 | "name": "name63", 314 | "value": "value63", 315 | "other": "other63" 316 | }, 317 | "key64": { 318 | "name": "name64", 319 | "value": "value64", 320 | "other": "other64" 321 | }, 322 | "key65": { 323 | "name": "name65", 324 | "value": "value65", 325 | "other": "other65" 326 | }, 327 | "key66": { 328 | "name": "name66", 329 | "value": "value66", 330 | "other": "other66" 331 | }, 332 | "key67": { 333 | "name": "name67", 334 | "value": "value67", 335 | "other": "other67" 336 | }, 337 | "key68": { 338 | "name": "name68", 339 | "value": "value68", 340 | "other": "other68" 341 | }, 342 | "key69": { 343 | "name": "name69", 344 | "value": "value69", 345 | "other": "other69" 346 | }, 347 | "key70": { 348 | "name": "name70", 349 | "value": "value70", 350 | "other": "other70" 351 | }, 352 | "key71": { 353 | "name": "name71", 354 | "value": "value71", 355 | "other": "other71" 356 | }, 357 | "key72": { 358 | "name": "name72", 359 | "value": "value72", 360 | "other": "other72" 361 | }, 362 | "key73": { 363 | "name": "name73", 364 | "value": "value73", 365 | "other": "other73" 366 | }, 367 | "key74": { 368 | "name": "name74", 369 | "value": "value74", 370 | "other": "other74" 371 | }, 372 | "key75": { 373 | "name": "name75", 374 | "value": "value75", 375 | "other": "other75" 376 | }, 377 | "key76": { 378 | "name": "name76", 379 | "value": "value76", 380 | "other": "other76" 381 | }, 382 | "key77": { 383 | "name": "name77", 384 | "value": "value77", 385 | "other": "other77" 386 | }, 387 | "key78": { 388 | "name": "name78", 389 | "value": "value78", 390 | "other": "other78" 391 | }, 392 | "key79": { 393 | "name": "name79", 394 | "value": "value79", 395 | "other": "other79" 396 | }, 397 | "key80": { 398 | "name": "name80", 399 | "value": "value80", 400 | "other": "other80" 401 | }, 402 | "key81": { 403 | "name": "name81", 404 | "value": "value81", 405 | "other": "other81" 406 | }, 407 | "key82": { 408 | "name": "name82", 409 | "value": "value82", 410 | "other": "other82" 411 | }, 412 | "key83": { 413 | "name": "name83", 414 | "value": "value83", 415 | "other": "other83" 416 | }, 417 | "key84": { 418 | "name": "name84", 419 | "value": "value84", 420 | "other": "other84" 421 | }, 422 | "key85": { 423 | "name": "name85", 424 | "value": "value85", 425 | "other": "other85" 426 | }, 427 | "key86": { 428 | "name": "name86", 429 | "value": "value86", 430 | "other": "other86" 431 | }, 432 | "key87": { 433 | "name": "name87", 434 | "value": "value87", 435 | "other": "other87" 436 | }, 437 | "key88": { 438 | "name": "name88", 439 | "value": "value88", 440 | "other": "other88" 441 | }, 442 | "key89": { 443 | "name": "name89", 444 | "value": "value89", 445 | "other": "other89" 446 | }, 447 | "key90": { 448 | "name": "name90", 449 | "value": "value90", 450 | "other": "other90" 451 | }, 452 | "key91": { 453 | "name": "name91", 454 | "value": "value91", 455 | "other": "other91" 456 | }, 457 | "key92": { 458 | "name": "name92", 459 | "value": "value92", 460 | "other": "other92" 461 | }, 462 | "key93": { 463 | "name": "name93", 464 | "value": "value93", 465 | "other": "other93" 466 | }, 467 | "key94": { 468 | "name": "name94", 469 | "value": "value94", 470 | "other": "other94" 471 | }, 472 | "key95": { 473 | "name": "name95", 474 | "value": "value95", 475 | "other": "other95" 476 | }, 477 | "key96": { 478 | "name": "name96", 479 | "value": "value96", 480 | "other": "other96" 481 | }, 482 | "key97": { 483 | "name": "name97", 484 | "value": "value97", 485 | "other": "other97" 486 | }, 487 | "key98": { 488 | "name": "name98", 489 | "value": "value98", 490 | "other": "other98" 491 | }, 492 | "key99": { 493 | "name": "name99", 494 | "value": "value99", 495 | "other": "other99" 496 | }, 497 | "key100": { 498 | "name": "name100", 499 | "value": "value100", 500 | "other": "other100" 501 | }, 502 | "key101": { 503 | "name": "name101", 504 | "value": "value101", 505 | "other": "other101" 506 | }, 507 | "key102": { 508 | "name": "name102", 509 | "value": "value102", 510 | "other": "other102" 511 | }, 512 | "key103": { 513 | "name": "name103", 514 | "value": "value103", 515 | "other": "other103" 516 | }, 517 | "key104": { 518 | "name": "name104", 519 | "value": "value104", 520 | "other": "other104" 521 | }, 522 | "key105": { 523 | "name": "name105", 524 | "value": "value105", 525 | "other": "other105" 526 | }, 527 | "key106": { 528 | "name": "name106", 529 | "value": "value106", 530 | "other": "other106" 531 | }, 532 | "key107": { 533 | "name": "name107", 534 | "value": "value107", 535 | "other": "other107" 536 | }, 537 | "key108": { 538 | "name": "name108", 539 | "value": "value108", 540 | "other": "other108" 541 | }, 542 | "key109": { 543 | "name": "name109", 544 | "value": "value109", 545 | "other": "other109" 546 | }, 547 | "key110": { 548 | "name": "name110", 549 | "value": "value110", 550 | "other": "other110" 551 | }, 552 | "key111": { 553 | "name": "name111", 554 | "value": "value111", 555 | "other": "other111" 556 | }, 557 | "key112": { 558 | "name": "name112", 559 | "value": "value112", 560 | "other": "other112" 561 | }, 562 | "key113": { 563 | "name": "name113", 564 | "value": "value113", 565 | "other": "other113" 566 | }, 567 | "key114": { 568 | "name": "name114", 569 | "value": "value114", 570 | "other": "other114" 571 | }, 572 | "key115": { 573 | "name": "name115", 574 | "value": "value115", 575 | "other": "other115" 576 | }, 577 | "key116": { 578 | "name": "name116", 579 | "value": "value116", 580 | "other": "other116" 581 | }, 582 | "key117": { 583 | "name": "name117", 584 | "value": "value117", 585 | "other": "other117" 586 | }, 587 | "key118": { 588 | "name": "name118", 589 | "value": "value118", 590 | "other": "other118" 591 | }, 592 | "key119": { 593 | "name": "name119", 594 | "value": "value119", 595 | "other": "other119" 596 | }, 597 | "key120": { 598 | "name": "name120", 599 | "value": "value120", 600 | "other": "other120" 601 | }, 602 | "key121": { 603 | "name": "name121", 604 | "value": "value121", 605 | "other": "other121" 606 | }, 607 | "key122": { 608 | "name": "name122", 609 | "value": "value122", 610 | "other": "other122" 611 | }, 612 | "key123": { 613 | "name": "name123", 614 | "value": "value123", 615 | "other": "other123" 616 | }, 617 | "key124": { 618 | "name": "name124", 619 | "value": "value124", 620 | "other": "other124" 621 | }, 622 | "key125": { 623 | "name": "name125", 624 | "value": "value125", 625 | "other": "other125" 626 | }, 627 | "key126": { 628 | "name": "name126", 629 | "value": "value126", 630 | "other": "other126" 631 | }, 632 | "key127": { 633 | "name": "name127", 634 | "value": "value127", 635 | "other": "other127" 636 | }, 637 | "key128": { 638 | "name": "name128", 639 | "value": "value128", 640 | "other": "other128" 641 | }, 642 | "key129": { 643 | "name": "name129", 644 | "value": "value129", 645 | "other": "other129" 646 | }, 647 | "key130": { 648 | "name": "name130", 649 | "value": "value130", 650 | "other": "other130" 651 | }, 652 | "key131": { 653 | "name": "name131", 654 | "value": "value131", 655 | "other": "other131" 656 | }, 657 | "key132": { 658 | "name": "name132", 659 | "value": "value132", 660 | "other": "other132" 661 | }, 662 | "key133": { 663 | "name": "name133", 664 | "value": "value133", 665 | "other": "other133" 666 | }, 667 | "key134": { 668 | "name": "name134", 669 | "value": "value134", 670 | "other": "other134" 671 | }, 672 | "key135": { 673 | "name": "name135", 674 | "value": "value135", 675 | "other": "other135" 676 | }, 677 | "key136": { 678 | "name": "name136", 679 | "value": "value136", 680 | "other": "other136" 681 | }, 682 | "key137": { 683 | "name": "name137", 684 | "value": "value137", 685 | "other": "other137" 686 | }, 687 | "key138": { 688 | "name": "name138", 689 | "value": "value138", 690 | "other": "other138" 691 | }, 692 | "key139": { 693 | "name": "name139", 694 | "value": "value139", 695 | "other": "other139" 696 | }, 697 | "key140": { 698 | "name": "name140", 699 | "value": "value140", 700 | "other": "other140" 701 | }, 702 | "key141": { 703 | "name": "name141", 704 | "value": "value141", 705 | "other": "other141" 706 | }, 707 | "key142": { 708 | "name": "name142", 709 | "value": "value142", 710 | "other": "other142" 711 | }, 712 | "key143": { 713 | "name": "name143", 714 | "value": "value143", 715 | "other": "other143" 716 | }, 717 | "key144": { 718 | "name": "name144", 719 | "value": "value144", 720 | "other": "other144" 721 | }, 722 | "key145": { 723 | "name": "name145", 724 | "value": "value145", 725 | "other": "other145" 726 | }, 727 | "key146": { 728 | "name": "name146", 729 | "value": "value146", 730 | "other": "other146" 731 | }, 732 | "key147": { 733 | "name": "name147", 734 | "value": "value147", 735 | "other": "other147" 736 | }, 737 | "key148": { 738 | "name": "name148", 739 | "value": "value148", 740 | "other": "other148" 741 | }, 742 | "key149": { 743 | "name": "name149", 744 | "value": "value149", 745 | "other": "other149" 746 | }, 747 | "key150": { 748 | "name": "name150", 749 | "value": "value150", 750 | "other": "other150" 751 | }, 752 | "key151": { 753 | "name": "name151", 754 | "value": "value151", 755 | "other": "other151" 756 | }, 757 | "key152": { 758 | "name": "name152", 759 | "value": "value152", 760 | "other": "other152" 761 | }, 762 | "key153": { 763 | "name": "name153", 764 | "value": "value153", 765 | "other": "other153" 766 | }, 767 | "key154": { 768 | "name": "name154", 769 | "value": "value154", 770 | "other": "other154" 771 | }, 772 | "key155": { 773 | "name": "name155", 774 | "value": "value155", 775 | "other": "other155" 776 | }, 777 | "key156": { 778 | "name": "name156", 779 | "value": "value156", 780 | "other": "other156" 781 | }, 782 | "key157": { 783 | "name": "name157", 784 | "value": "value157", 785 | "other": "other157" 786 | }, 787 | "key158": { 788 | "name": "name158", 789 | "value": "value158", 790 | "other": "other158" 791 | }, 792 | "key159": { 793 | "name": "name159", 794 | "value": "value159", 795 | "other": "other159" 796 | }, 797 | "key160": { 798 | "name": "name160", 799 | "value": "value160", 800 | "other": "other160" 801 | }, 802 | "key161": { 803 | "name": "name161", 804 | "value": "value161", 805 | "other": "other161" 806 | }, 807 | "key162": { 808 | "name": "name162", 809 | "value": "value162", 810 | "other": "other162" 811 | }, 812 | "key163": { 813 | "name": "name163", 814 | "value": "value163", 815 | "other": "other163" 816 | }, 817 | "key164": { 818 | "name": "name164", 819 | "value": "value164", 820 | "other": "other164" 821 | }, 822 | "key165": { 823 | "name": "name165", 824 | "value": "value165", 825 | "other": "other165" 826 | }, 827 | "key166": { 828 | "name": "name166", 829 | "value": "value166", 830 | "other": "other166" 831 | }, 832 | "key167": { 833 | "name": "name167", 834 | "value": "value167", 835 | "other": "other167" 836 | }, 837 | "key168": { 838 | "name": "name168", 839 | "value": "value168", 840 | "other": "other168" 841 | }, 842 | "key169": { 843 | "name": "name169", 844 | "value": "value169", 845 | "other": "other169" 846 | }, 847 | "key170": { 848 | "name": "name170", 849 | "value": "value170", 850 | "other": "other170" 851 | }, 852 | "key171": { 853 | "name": "name171", 854 | "value": "value171", 855 | "other": "other171" 856 | }, 857 | "key172": { 858 | "name": "name172", 859 | "value": "value172", 860 | "other": "other172" 861 | }, 862 | "key173": { 863 | "name": "name173", 864 | "value": "value173", 865 | "other": "other173" 866 | }, 867 | "key174": { 868 | "name": "name174", 869 | "value": "value174", 870 | "other": "other174" 871 | }, 872 | "key175": { 873 | "name": "name175", 874 | "value": "value175", 875 | "other": "other175" 876 | }, 877 | "key176": { 878 | "name": "name176", 879 | "value": "value176", 880 | "other": "other176" 881 | }, 882 | "key177": { 883 | "name": "name177", 884 | "value": "value177", 885 | "other": "other177" 886 | }, 887 | "key178": { 888 | "name": "name178", 889 | "value": "value178", 890 | "other": "other178" 891 | }, 892 | "key179": { 893 | "name": "name179", 894 | "value": "value179", 895 | "other": "other179" 896 | }, 897 | "key180": { 898 | "name": "name180", 899 | "value": "value180", 900 | "other": "other180" 901 | }, 902 | "key181": { 903 | "name": "name181", 904 | "value": "value181", 905 | "other": "other181" 906 | }, 907 | "key182": { 908 | "name": "name182", 909 | "value": "value182", 910 | "other": "other182" 911 | }, 912 | "key183": { 913 | "name": "name183", 914 | "value": "value183", 915 | "other": "other183" 916 | }, 917 | "key184": { 918 | "name": "name184", 919 | "value": "value184", 920 | "other": "other184" 921 | }, 922 | "key185": { 923 | "name": "name185", 924 | "value": "value185", 925 | "other": "other185" 926 | }, 927 | "key186": { 928 | "name": "name186", 929 | "value": "value186", 930 | "other": "other186" 931 | }, 932 | "key187": { 933 | "name": "name187", 934 | "value": "value187", 935 | "other": "other187" 936 | }, 937 | "key188": { 938 | "name": "name188", 939 | "value": "value188", 940 | "other": "other188" 941 | }, 942 | "key189": { 943 | "name": "name189", 944 | "value": "value189", 945 | "other": "other189" 946 | }, 947 | "key190": { 948 | "name": "name190", 949 | "value": "value190", 950 | "other": "other190" 951 | }, 952 | "key191": { 953 | "name": "name191", 954 | "value": "value191", 955 | "other": "other191" 956 | }, 957 | "key192": { 958 | "name": "name192", 959 | "value": "value192", 960 | "other": "other192" 961 | }, 962 | "key193": { 963 | "name": "name193", 964 | "value": "value193", 965 | "other": "other193" 966 | }, 967 | "key194": { 968 | "name": "name194", 969 | "value": "value194", 970 | "other": "other194" 971 | }, 972 | "key195": { 973 | "name": "name195", 974 | "value": "value195", 975 | "other": "other195" 976 | }, 977 | "key196": { 978 | "name": "name196", 979 | "value": "value196", 980 | "other": "other196" 981 | }, 982 | "key197": { 983 | "name": "name197", 984 | "value": "value197", 985 | "other": "other197" 986 | }, 987 | "key198": { 988 | "name": "name198", 989 | "value": "value198", 990 | "other": "other198" 991 | }, 992 | "key199": { 993 | "name": "name199", 994 | "value": "value199", 995 | "other": "other199" 996 | }, 997 | "key200": { 998 | "name": "name200", 999 | "value": "value200", 1000 | "other": "other200" 1001 | }, 1002 | "key201": { 1003 | "name": "name201", 1004 | "value": "value201", 1005 | "other": "other201" 1006 | }, 1007 | "key202": { 1008 | "name": "name202", 1009 | "value": "value202", 1010 | "other": "other202" 1011 | }, 1012 | "key203": { 1013 | "name": "name203", 1014 | "value": "value203", 1015 | "other": "other203" 1016 | }, 1017 | "key204": { 1018 | "name": "name204", 1019 | "value": "value204", 1020 | "other": "other204" 1021 | }, 1022 | "key205": { 1023 | "name": "name205", 1024 | "value": "value205", 1025 | "other": "other205" 1026 | }, 1027 | "key206": { 1028 | "name": "name206", 1029 | "value": "value206", 1030 | "other": "other206" 1031 | }, 1032 | "key207": { 1033 | "name": "name207", 1034 | "value": "value207", 1035 | "other": "other207" 1036 | }, 1037 | "key208": { 1038 | "name": "name208", 1039 | "value": "value208", 1040 | "other": "other208" 1041 | }, 1042 | "key209": { 1043 | "name": "name209", 1044 | "value": "value209", 1045 | "other": "other209" 1046 | }, 1047 | "key210": { 1048 | "name": "name210", 1049 | "value": "value210", 1050 | "other": "other210" 1051 | }, 1052 | "key211": { 1053 | "name": "name211", 1054 | "value": "value211", 1055 | "other": "other211" 1056 | }, 1057 | "key212": { 1058 | "name": "name212", 1059 | "value": "value212", 1060 | "other": "other212" 1061 | }, 1062 | "key213": { 1063 | "name": "name213", 1064 | "value": "value213", 1065 | "other": "other213" 1066 | }, 1067 | "key214": { 1068 | "name": "name214", 1069 | "value": "value214", 1070 | "other": "other214" 1071 | }, 1072 | "key215": { 1073 | "name": "name215", 1074 | "value": "value215", 1075 | "other": "other215" 1076 | }, 1077 | "key216": { 1078 | "name": "name216", 1079 | "value": "value216", 1080 | "other": "other216" 1081 | }, 1082 | "key217": { 1083 | "name": "name217", 1084 | "value": "value217", 1085 | "other": "other217" 1086 | }, 1087 | "key218": { 1088 | "name": "name218", 1089 | "value": "value218", 1090 | "other": "other218" 1091 | }, 1092 | "key219": { 1093 | "name": "name219", 1094 | "value": "value219", 1095 | "other": "other219" 1096 | }, 1097 | "key220": { 1098 | "name": "name220", 1099 | "value": "value220", 1100 | "other": "other220" 1101 | }, 1102 | "key221": { 1103 | "name": "name221", 1104 | "value": "value221", 1105 | "other": "other221" 1106 | }, 1107 | "key222": { 1108 | "name": "name222", 1109 | "value": "value222", 1110 | "other": "other222" 1111 | }, 1112 | "key223": { 1113 | "name": "name223", 1114 | "value": "value223", 1115 | "other": "other223" 1116 | }, 1117 | "key224": { 1118 | "name": "name224", 1119 | "value": "value224", 1120 | "other": "other224" 1121 | }, 1122 | "key225": { 1123 | "name": "name225", 1124 | "value": "value225", 1125 | "other": "other225" 1126 | }, 1127 | "key226": { 1128 | "name": "name226", 1129 | "value": "value226", 1130 | "other": "other226" 1131 | }, 1132 | "key227": { 1133 | "name": "name227", 1134 | "value": "value227", 1135 | "other": "other227" 1136 | }, 1137 | "key228": { 1138 | "name": "name228", 1139 | "value": "value228", 1140 | "other": "other228" 1141 | }, 1142 | "key229": { 1143 | "name": "name229", 1144 | "value": "value229", 1145 | "other": "other229" 1146 | }, 1147 | "key230": { 1148 | "name": "name230", 1149 | "value": "value230", 1150 | "other": "other230" 1151 | }, 1152 | "key231": { 1153 | "name": "name231", 1154 | "value": "value231", 1155 | "other": "other231" 1156 | }, 1157 | "key232": { 1158 | "name": "name232", 1159 | "value": "value232", 1160 | "other": "other232" 1161 | }, 1162 | "key233": { 1163 | "name": "name233", 1164 | "value": "value233", 1165 | "other": "other233" 1166 | }, 1167 | "key234": { 1168 | "name": "name234", 1169 | "value": "value234", 1170 | "other": "other234" 1171 | }, 1172 | "key235": { 1173 | "name": "name235", 1174 | "value": "value235", 1175 | "other": "other235" 1176 | }, 1177 | "key236": { 1178 | "name": "name236", 1179 | "value": "value236", 1180 | "other": "other236" 1181 | }, 1182 | "key237": { 1183 | "name": "name237", 1184 | "value": "value237", 1185 | "other": "other237" 1186 | }, 1187 | "key238": { 1188 | "name": "name238", 1189 | "value": "value238", 1190 | "other": "other238" 1191 | }, 1192 | "key239": { 1193 | "name": "name239", 1194 | "value": "value239", 1195 | "other": "other239" 1196 | }, 1197 | "key240": { 1198 | "name": "name240", 1199 | "value": "value240", 1200 | "other": "other240" 1201 | }, 1202 | "key241": { 1203 | "name": "name241", 1204 | "value": "value241", 1205 | "other": "other241" 1206 | }, 1207 | "key242": { 1208 | "name": "name242", 1209 | "value": "value242", 1210 | "other": "other242" 1211 | }, 1212 | "key243": { 1213 | "name": "name243", 1214 | "value": "value243", 1215 | "other": "other243" 1216 | }, 1217 | "key244": { 1218 | "name": "name244", 1219 | "value": "value244", 1220 | "other": "other244" 1221 | }, 1222 | "key245": { 1223 | "name": "name245", 1224 | "value": "value245", 1225 | "other": "other245" 1226 | }, 1227 | "key246": { 1228 | "name": "name246", 1229 | "value": "value246", 1230 | "other": "other246" 1231 | }, 1232 | "key247": { 1233 | "name": "name247", 1234 | "value": "value247", 1235 | "other": "other247" 1236 | }, 1237 | "key248": { 1238 | "name": "name248", 1239 | "value": "value248", 1240 | "other": "other248" 1241 | }, 1242 | "key249": { 1243 | "name": "name249", 1244 | "value": "value249", 1245 | "other": "other249" 1246 | }, 1247 | "key250": { 1248 | "name": "name250", 1249 | "value": "value250", 1250 | "other": "other250" 1251 | }, 1252 | "key251": { 1253 | "name": "name251", 1254 | "value": "value251", 1255 | "other": "other251" 1256 | }, 1257 | "key252": { 1258 | "name": "name252", 1259 | "value": "value252", 1260 | "other": "other252" 1261 | }, 1262 | "key253": { 1263 | "name": "name253", 1264 | "value": "value253", 1265 | "other": "other253" 1266 | }, 1267 | "key254": { 1268 | "name": "name254", 1269 | "value": "value254", 1270 | "other": "other254" 1271 | }, 1272 | "key255": { 1273 | "name": "name255", 1274 | "value": "value255", 1275 | "other": "other255" 1276 | }, 1277 | "key256": { 1278 | "name": "name256", 1279 | "value": "value256", 1280 | "other": "other256" 1281 | }, 1282 | "key257": { 1283 | "name": "name257", 1284 | "value": "value257", 1285 | "other": "other257" 1286 | }, 1287 | "key258": { 1288 | "name": "name258", 1289 | "value": "value258", 1290 | "other": "other258" 1291 | }, 1292 | "key259": { 1293 | "name": "name259", 1294 | "value": "value259", 1295 | "other": "other259" 1296 | }, 1297 | "key260": { 1298 | "name": "name260", 1299 | "value": "value260", 1300 | "other": "other260" 1301 | }, 1302 | "key261": { 1303 | "name": "name261", 1304 | "value": "value261", 1305 | "other": "other261" 1306 | }, 1307 | "key262": { 1308 | "name": "name262", 1309 | "value": "value262", 1310 | "other": "other262" 1311 | }, 1312 | "key263": { 1313 | "name": "name263", 1314 | "value": "value263", 1315 | "other": "other263" 1316 | }, 1317 | "key264": { 1318 | "name": "name264", 1319 | "value": "value264", 1320 | "other": "other264" 1321 | }, 1322 | "key265": { 1323 | "name": "name265", 1324 | "value": "value265", 1325 | "other": "other265" 1326 | }, 1327 | "key266": { 1328 | "name": "name266", 1329 | "value": "value266", 1330 | "other": "other266" 1331 | }, 1332 | "key267": { 1333 | "name": "name267", 1334 | "value": "value267", 1335 | "other": "other267" 1336 | }, 1337 | "key268": { 1338 | "name": "name268", 1339 | "value": "value268", 1340 | "other": "other268" 1341 | }, 1342 | "key269": { 1343 | "name": "name269", 1344 | "value": "value269", 1345 | "other": "other269" 1346 | }, 1347 | "key270": { 1348 | "name": "name270", 1349 | "value": "value270", 1350 | "other": "other270" 1351 | }, 1352 | "key271": { 1353 | "name": "name271", 1354 | "value": "value271", 1355 | "other": "other271" 1356 | }, 1357 | "key272": { 1358 | "name": "name272", 1359 | "value": "value272", 1360 | "other": "other272" 1361 | }, 1362 | "key273": { 1363 | "name": "name273", 1364 | "value": "value273", 1365 | "other": "other273" 1366 | }, 1367 | "key274": { 1368 | "name": "name274", 1369 | "value": "value274", 1370 | "other": "other274" 1371 | }, 1372 | "key275": { 1373 | "name": "name275", 1374 | "value": "value275", 1375 | "other": "other275" 1376 | }, 1377 | "key276": { 1378 | "name": "name276", 1379 | "value": "value276", 1380 | "other": "other276" 1381 | }, 1382 | "key277": { 1383 | "name": "name277", 1384 | "value": "value277", 1385 | "other": "other277" 1386 | }, 1387 | "key278": { 1388 | "name": "name278", 1389 | "value": "value278", 1390 | "other": "other278" 1391 | }, 1392 | "key279": { 1393 | "name": "name279", 1394 | "value": "value279", 1395 | "other": "other279" 1396 | }, 1397 | "key280": { 1398 | "name": "name280", 1399 | "value": "value280", 1400 | "other": "other280" 1401 | }, 1402 | "key281": { 1403 | "name": "name281", 1404 | "value": "value281", 1405 | "other": "other281" 1406 | }, 1407 | "key282": { 1408 | "name": "name282", 1409 | "value": "value282", 1410 | "other": "other282" 1411 | }, 1412 | "key283": { 1413 | "name": "name283", 1414 | "value": "value283", 1415 | "other": "other283" 1416 | }, 1417 | "key284": { 1418 | "name": "name284", 1419 | "value": "value284", 1420 | "other": "other284" 1421 | }, 1422 | "key285": { 1423 | "name": "name285", 1424 | "value": "value285", 1425 | "other": "other285" 1426 | }, 1427 | "key286": { 1428 | "name": "name286", 1429 | "value": "value286", 1430 | "other": "other286" 1431 | }, 1432 | "key287": { 1433 | "name": "name287", 1434 | "value": "value287", 1435 | "other": "other287" 1436 | }, 1437 | "key288": { 1438 | "name": "name288", 1439 | "value": "value288", 1440 | "other": "other288" 1441 | }, 1442 | "key289": { 1443 | "name": "name289", 1444 | "value": "value289", 1445 | "other": "other289" 1446 | }, 1447 | "key290": { 1448 | "name": "name290", 1449 | "value": "value290", 1450 | "other": "other290" 1451 | }, 1452 | "key291": { 1453 | "name": "name291", 1454 | "value": "value291", 1455 | "other": "other291" 1456 | }, 1457 | "key292": { 1458 | "name": "name292", 1459 | "value": "value292", 1460 | "other": "other292" 1461 | }, 1462 | "key293": { 1463 | "name": "name293", 1464 | "value": "value293", 1465 | "other": "other293" 1466 | }, 1467 | "key294": { 1468 | "name": "name294", 1469 | "value": "value294", 1470 | "other": "other294" 1471 | }, 1472 | "key295": { 1473 | "name": "name295", 1474 | "value": "value295", 1475 | "other": "other295" 1476 | }, 1477 | "key296": { 1478 | "name": "name296", 1479 | "value": "value296", 1480 | "other": "other296" 1481 | }, 1482 | "key297": { 1483 | "name": "name297", 1484 | "value": "value297", 1485 | "other": "other297" 1486 | }, 1487 | "key298": { 1488 | "name": "name298", 1489 | "value": "value298", 1490 | "other": "other298" 1491 | }, 1492 | "key299": { 1493 | "name": "name299", 1494 | "value": "value299", 1495 | "other": "other299" 1496 | }, 1497 | "key300": { 1498 | "name": "name300", 1499 | "value": "value300", 1500 | "other": "other300" 1501 | } 1502 | } 1503 | -------------------------------------------------------------------------------- /tests/assets/large_file_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "key1": { 3 | "name": "name1", 4 | "value": "value1", 5 | "other": "other1" 6 | }, 7 | "key2": { 8 | "name": "name2", 9 | "value": "value2", 10 | "other": "other2" 11 | }, 12 | "key3": { 13 | "name": "name3", 14 | "value": "value3", 15 | "other": "other3" 16 | }, 17 | "key4": { 18 | "name": "name4", 19 | "value": "value4", 20 | "other": "other4" 21 | }, 22 | "key5": { 23 | "name": "name5", 24 | "value": "value5", 25 | "other": "other5" 26 | }, 27 | "key6": { 28 | "name": "name6", 29 | "value": "value6", 30 | "other": "other6" 31 | }, 32 | "key7": { 33 | "name": "name7", 34 | "value": "value7", 35 | "other": "other7" 36 | }, 37 | "key8": { 38 | "name": "name8", 39 | "value": "value8", 40 | "other": "other8" 41 | }, 42 | "key9": { 43 | "name": "name9", 44 | "value": "value9", 45 | "other": "other9" 46 | }, 47 | "key10": { 48 | "name": "name10", 49 | "value": "value10", 50 | "other": "other10" 51 | }, 52 | "key11": { 53 | "name": "name11", 54 | "value": "value11", 55 | "other": "other11" 56 | }, 57 | "key12": { 58 | "name": "name12", 59 | "value": "value12", 60 | "other": "other12" 61 | }, 62 | "key13": { 63 | "name": "name13", 64 | "value": "value13", 65 | "other": "other13" 66 | }, 67 | "key14": { 68 | "name": "name14", 69 | "value": "value14", 70 | "other": "other14" 71 | }, 72 | "key15": { 73 | "name": "name15", 74 | "value": "value15", 75 | "other": "other15" 76 | }, 77 | "key16": { 78 | "name": "name16", 79 | "value": "value16", 80 | "other": "other16" 81 | }, 82 | "key17": { 83 | "name": "name17", 84 | "value": "value17", 85 | "other": "other17" 86 | }, 87 | "key18": { 88 | "name": "name18", 89 | "value": "value18", 90 | "other": "other18" 91 | }, 92 | "key19": { 93 | "name": "name19", 94 | "value": "value19", 95 | "other": "other19" 96 | }, 97 | "key20": { 98 | "name": "name20", 99 | "value": "value20", 100 | "other": "other20" 101 | }, 102 | "key21": { 103 | "name": "name21", 104 | "value": "value21", 105 | "other": "other21" 106 | }, 107 | "key22": { 108 | "name": "name22", 109 | "value": "value22", 110 | "other": "other22" 111 | }, 112 | "key23": { 113 | "name": "name23", 114 | "value": "value23", 115 | "other": "other23" 116 | }, 117 | "key24": { 118 | "name": "name24", 119 | "value": "value24", 120 | "other": "other24" 121 | }, 122 | "key25": { 123 | "name": "name25", 124 | "value": "value25", 125 | "other": "other25" 126 | }, 127 | "key26": { 128 | "name": "name26", 129 | "value": "value26", 130 | "other": "other26" 131 | }, 132 | "key27": { 133 | "name": "name27", 134 | "value": "value27", 135 | "other": "other27" 136 | }, 137 | "key28": { 138 | "name": "name28", 139 | "value": "value28", 140 | "other": "other28" 141 | }, 142 | "key29": { 143 | "name": "name29", 144 | "value": "value29", 145 | "other": "other29" 146 | }, 147 | "key30": { 148 | "name": "name30", 149 | "value": "value30", 150 | "other": "other30" 151 | }, 152 | "key31": { 153 | "name": "name31", 154 | "value": "value31", 155 | "other": "other31" 156 | }, 157 | "key32": { 158 | "name": "name32", 159 | "value": "value32", 160 | "other": "other32" 161 | }, 162 | "key33": { 163 | "name": "name33", 164 | "value": "value33", 165 | "other": "other33" 166 | }, 167 | "key34": { 168 | "name": "name34", 169 | "value": "value34", 170 | "other": "other34" 171 | }, 172 | "key35": { 173 | "name": "name35", 174 | "value": "value35", 175 | "other": "other35" 176 | }, 177 | "key36": { 178 | "name": "name36", 179 | "value": "value36", 180 | "other": "other36" 181 | }, 182 | "key37": { 183 | "name": "name37", 184 | "value": "value37", 185 | "other": "other37" 186 | }, 187 | "key38": { 188 | "name": "name38", 189 | "value": "value38", 190 | "other": "other38" 191 | }, 192 | "key39": { 193 | "name": "name39", 194 | "value": "value39", 195 | "other": "other39" 196 | }, 197 | "key40": { 198 | "name": "name40", 199 | "value": "value40", 200 | "other": "other40" 201 | }, 202 | "key41": { 203 | "name": "name41", 204 | "value": "value41", 205 | "other": "other41" 206 | }, 207 | "key42": { 208 | "name": "name42", 209 | "value": "value42", 210 | "other": "other42" 211 | }, 212 | "key43": { 213 | "name": "name43", 214 | "value": "value43", 215 | "other": "other43" 216 | }, 217 | "key44": { 218 | "name": "name44", 219 | "value": "value44", 220 | "other": "other44" 221 | }, 222 | "key45": { 223 | "name": "name45", 224 | "value": "value45", 225 | "other": "other45" 226 | }, 227 | "key46": { 228 | "name": "name46", 229 | "value": "value46", 230 | "other": "other46" 231 | }, 232 | "key47": { 233 | "name": "name47", 234 | "value": "value47", 235 | "other": "other47" 236 | }, 237 | "key48": { 238 | "name": "name48", 239 | "value": "value48", 240 | "other": "other48" 241 | }, 242 | "key49": { 243 | "name": "name49", 244 | "value": "value49", 245 | "other": "other49" 246 | }, 247 | "key50": { 248 | "name": "name50", 249 | "value": "value50", 250 | "other": "other50" 251 | }, 252 | "key51": { 253 | "name": "name51", 254 | "value": "value51", 255 | "other": "other51" 256 | }, 257 | "key52": { 258 | "name": "name52", 259 | "value": "value52", 260 | "other": "other52" 261 | }, 262 | "key53": { 263 | "name": "name53", 264 | "value": "value53", 265 | "other": "other53" 266 | }, 267 | "key54": { 268 | "name": "name54", 269 | "value": "value54", 270 | "other": "other54" 271 | }, 272 | "key55": { 273 | "name": "name55", 274 | "value": "value55", 275 | "other": "other55" 276 | }, 277 | "key56": { 278 | "name": "name56", 279 | "value": "value56", 280 | "other": "other56" 281 | }, 282 | "key57": { 283 | "name": "name57", 284 | "value": "value57", 285 | "other": "other57" 286 | }, 287 | "key58": { 288 | "name": "name58", 289 | "value": "value58", 290 | "other": "other58" 291 | }, 292 | "key59": { 293 | "name": "name59", 294 | "value": "value59", 295 | "other": "other59" 296 | }, 297 | "key60": { 298 | "name": "name60", 299 | "value": "value60", 300 | "other": "other60" 301 | }, 302 | "key61": { 303 | "name": "name61", 304 | "value": "value61", 305 | "other": "other61" 306 | }, 307 | "key62": { 308 | "name": "name62", 309 | "value": "value62", 310 | "other": "other62" 311 | }, 312 | "key63": { 313 | "name": "name63", 314 | "value": "value63", 315 | "other": "other63" 316 | }, 317 | "key64": { 318 | "name": "name64", 319 | "value": "value64", 320 | "other": "other64" 321 | }, 322 | "key65": { 323 | "name": "name65", 324 | "value": "value65", 325 | "other": "other65" 326 | }, 327 | "key66": { 328 | "name": "name66", 329 | "value": "value66", 330 | "other": "other66" 331 | }, 332 | "key67": { 333 | "name": "name67", 334 | "value": "value67", 335 | "other": "other67" 336 | }, 337 | "key68": { 338 | "name": "name68", 339 | "value": "value68", 340 | "other": "other68" 341 | }, 342 | "key69": { 343 | "name": "name69", 344 | "value": "value69", 345 | "other": "other69" 346 | }, 347 | "key70": { 348 | "name": "name70", 349 | "value": "value70", 350 | "other": "other70" 351 | }, 352 | "key71": { 353 | "name": "name71", 354 | "value": "value71", 355 | "other": "other71" 356 | }, 357 | "key72": { 358 | "name": "name72", 359 | "value": "value72", 360 | "other": "other72" 361 | }, 362 | "key73": { 363 | "name": "name73", 364 | "value": "value73", 365 | "other": "other73" 366 | }, 367 | "key74": { 368 | "name": "name74", 369 | "value": "value74", 370 | "other": "other74" 371 | }, 372 | "key75": { 373 | "name": "name75", 374 | "value": "value75", 375 | "other": "other75" 376 | }, 377 | "key76": { 378 | "name": "name76", 379 | "value": "value76", 380 | "other": "other76" 381 | }, 382 | "key77": { 383 | "name": "name77", 384 | "value": "value77", 385 | "other": "other77" 386 | }, 387 | "key78": { 388 | "name": "name78", 389 | "value": "value78", 390 | "other": "other78" 391 | }, 392 | "key79": { 393 | "name": "name79", 394 | "value": "value79", 395 | "other": "other79" 396 | }, 397 | "key80": { 398 | "name": "name80", 399 | "value": "value80", 400 | "other": "other80" 401 | }, 402 | "key81": { 403 | "name": "name81", 404 | "value": "value81", 405 | "other": "other81" 406 | }, 407 | "key82": { 408 | "name": "name82", 409 | "value": "value82", 410 | "other": "other82" 411 | }, 412 | "key83": { 413 | "name": "name83", 414 | "value": "value83", 415 | "other": "other83" 416 | }, 417 | "key84": { 418 | "name": "name84", 419 | "value": "value84", 420 | "other": "other84" 421 | }, 422 | "key85": { 423 | "name": "name85", 424 | "value": "value85", 425 | "other": "other85" 426 | }, 427 | "key86": { 428 | "name": "name86", 429 | "value": "value86", 430 | "other": "other86" 431 | }, 432 | "key87": { 433 | "name": "name87", 434 | "value": "value87", 435 | "other": "other87" 436 | }, 437 | "key88": { 438 | "name": "name88", 439 | "value": "value88", 440 | "other": "other88" 441 | }, 442 | "key89": { 443 | "name": "name89", 444 | "value": "value89", 445 | "other": "other89" 446 | }, 447 | "key90": { 448 | "name": "name90", 449 | "value": "value90", 450 | "other": "other90" 451 | }, 452 | "key91": { 453 | "name": "name91", 454 | "value": "value91", 455 | "other": "other91" 456 | }, 457 | "key92": { 458 | "name": "name92", 459 | "value": "value92", 460 | "other": "other92" 461 | }, 462 | "key93": { 463 | "name": "name93", 464 | "value": "value93", 465 | "other": "other93" 466 | }, 467 | "key94": { 468 | "name": "name94", 469 | "value": "value94", 470 | "other": "other94" 471 | }, 472 | "key95": { 473 | "name": "name95", 474 | "value": "value95", 475 | "other": "other95" 476 | }, 477 | "key96": { 478 | "name": "name96", 479 | "value": "value96", 480 | "other": "other96" 481 | }, 482 | "key97": { 483 | "name": "name97", 484 | "value": "value97", 485 | "other": "other97" 486 | }, 487 | "key98": { 488 | "name": "name98", 489 | "value": "value98", 490 | "other": "other98" 491 | }, 492 | "key99": { 493 | "name": "name99", 494 | "value": "value99", 495 | "other": "other99" 496 | }, 497 | "key100": { 498 | "name": "name100", 499 | "value": "value100", 500 | "other": "other100" 501 | }, 502 | "key101": { 503 | "name": "name101", 504 | "value": "value101", 505 | "other": "other101" 506 | }, 507 | "key102": { 508 | "name": "name102", 509 | "value": "value102", 510 | "other": "other102" 511 | }, 512 | "key103": { 513 | "name": "name103", 514 | "value": "value103", 515 | "other": "other103" 516 | }, 517 | "key104": { 518 | "name": "name104", 519 | "value": "value104", 520 | "other": "other104" 521 | }, 522 | "key105": { 523 | "name": "name105", 524 | "value": "value105", 525 | "other": "other105" 526 | }, 527 | "key106": { 528 | "name": "name106", 529 | "value": "value106", 530 | "other": "other106" 531 | }, 532 | "key107": { 533 | "name": "name107", 534 | "value": "value107", 535 | "other": "other107" 536 | }, 537 | "key108": { 538 | "name": "name108", 539 | "value": "value108", 540 | "other": "other108" 541 | }, 542 | "key109": { 543 | "name": "name109", 544 | "value": "value109", 545 | "other": "other109" 546 | }, 547 | "key110": { 548 | "name": "name110", 549 | "value": "value110", 550 | "other": "other110" 551 | }, 552 | "key111": { 553 | "name": "name111", 554 | "value": "value111", 555 | "other": "other111" 556 | }, 557 | "key112": { 558 | "name": "name112", 559 | "value": "value112", 560 | "other": "other112" 561 | }, 562 | "key113": { 563 | "name": "name113", 564 | "value": "value113", 565 | "other": "other113" 566 | }, 567 | "key114": { 568 | "name": "name114", 569 | "value": "value114", 570 | "other": "other114" 571 | }, 572 | "key115": { 573 | "name": "name115", 574 | "value": "value115", 575 | "other": "other115" 576 | }, 577 | "key116": { 578 | "name": "name116", 579 | "value": "value116", 580 | "other": "other116" 581 | }, 582 | "key117": { 583 | "name": "name117", 584 | "value": "value117", 585 | "other": "other117" 586 | }, 587 | "key118": { 588 | "name": "name118", 589 | "value": "value118", 590 | "other": "other118" 591 | }, 592 | "key119": { 593 | "name": "name119", 594 | "value": "value119", 595 | "other": "other119" 596 | }, 597 | "key120": { 598 | "name": "name120", 599 | "value": "value120", 600 | "other": "other120" 601 | }, 602 | "key121": { 603 | "name": "name121", 604 | "value": "value121", 605 | "other": "other121" 606 | }, 607 | "key122": { 608 | "name": "name122", 609 | "value": "value122", 610 | "other": "other122" 611 | }, 612 | "key123": { 613 | "name": "name123", 614 | "value": "value123", 615 | "other": "other123" 616 | }, 617 | "key124": { 618 | "name": "name124", 619 | "value": "value124", 620 | "other": "other124" 621 | }, 622 | "key125": { 623 | "name": "name125", 624 | "value": "value125", 625 | "other": "other125" 626 | }, 627 | "key126": { 628 | "name": "name126", 629 | "value": "value126", 630 | "other": "other126" 631 | }, 632 | "key127": { 633 | "name": "name127", 634 | "value": "value127", 635 | "other": "other127" 636 | }, 637 | "key128": { 638 | "name": "name128", 639 | "value": "value128", 640 | "other": "other128" 641 | }, 642 | "key129": { 643 | "name": "name129", 644 | "value": "value129", 645 | "other": "other129" 646 | }, 647 | "key130": { 648 | "name": "name130", 649 | "value": "value130", 650 | "other": "other130" 651 | }, 652 | "key131": { 653 | "name": "name131", 654 | "value": "value131", 655 | "other": "other131" 656 | }, 657 | "key132": { 658 | "name": "name132", 659 | "value": "value132", 660 | "other": "other132" 661 | }, 662 | "key133": { 663 | "name": "name133", 664 | "value": "value133", 665 | "other": "other133" 666 | }, 667 | "key134": { 668 | "name": "name134", 669 | "value": "value134", 670 | "other": "other134" 671 | }, 672 | "key135": { 673 | "name": "name135", 674 | "value": "value135", 675 | "other": "other135" 676 | }, 677 | "key136": { 678 | "name": "name136", 679 | "value": "value136", 680 | "other": "other136" 681 | }, 682 | "key137": { 683 | "name": "name137", 684 | "value": "value137", 685 | "other": "other137" 686 | }, 687 | "key138": { 688 | "name": "name138", 689 | "value": "value138", 690 | "other": "other138" 691 | }, 692 | "key139": { 693 | "name": "name139", 694 | "value": "value139", 695 | "other": "other139" 696 | }, 697 | "key140": { 698 | "name": "name140", 699 | "value": "value140", 700 | "other": "other140" 701 | }, 702 | "key141": { 703 | "name": "name141", 704 | "value": "value141", 705 | "other": "other141" 706 | }, 707 | "key142": { 708 | "name": "name142", 709 | "value": "value142", 710 | "other": "other142" 711 | }, 712 | "key143": { 713 | "name": "name143", 714 | "value": "value143", 715 | "other": "other143" 716 | }, 717 | "key144": { 718 | "name": "name144", 719 | "value": "value144", 720 | "other": "other144" 721 | }, 722 | "key145": { 723 | "name": "name145", 724 | "value": "value145", 725 | "other": "other145" 726 | }, 727 | "key146": { 728 | "name": "name146", 729 | "value": "value146", 730 | "other": "other146" 731 | }, 732 | "key147": { 733 | "name": "name147", 734 | "value": "value147", 735 | "other": "other147" 736 | }, 737 | "key148": { 738 | "name": "name148", 739 | "value": "value148", 740 | "other": "other148" 741 | }, 742 | "key149": { 743 | "name": "name149", 744 | "value": "value149", 745 | "other": "other149" 746 | }, 747 | "key150": { 748 | "name": "name150", 749 | "value": "value150", 750 | "other": "other150" 751 | }, 752 | "key151": { 753 | "name": "name151", 754 | "value": "value151", 755 | "other": "other151" 756 | }, 757 | "key152": { 758 | "name": "name152", 759 | "value": "value152", 760 | "other": "other152" 761 | }, 762 | "key153": { 763 | "name": "name153", 764 | "value": "value153", 765 | "other": "other153" 766 | }, 767 | "key154": { 768 | "name": "name154", 769 | "value": "value154", 770 | "other": "other154" 771 | }, 772 | "key155": { 773 | "name": "name155", 774 | "value": "value155", 775 | "other": "other155" 776 | }, 777 | "key156": { 778 | "name": "name156", 779 | "value": "value156", 780 | "other": "other156" 781 | }, 782 | "key157": { 783 | "name": "name157", 784 | "value": "value157", 785 | "other": "other157" 786 | }, 787 | "key158": { 788 | "name": "name158", 789 | "value": "value158", 790 | "other": "other158" 791 | }, 792 | "key159": { 793 | "name": "name159", 794 | "value": "value159", 795 | "other": "other159" 796 | }, 797 | "key160": { 798 | "name": "name160", 799 | "value": "value160", 800 | "other": "other160" 801 | }, 802 | "key161": { 803 | "name": "name161", 804 | "value": "value161", 805 | "other": "other161" 806 | }, 807 | "key162": { 808 | "name": "name162", 809 | "value": "value162", 810 | "other": "other162" 811 | }, 812 | "key163": { 813 | "name": "name163", 814 | "value": "value163", 815 | "other": "other163" 816 | }, 817 | "key164": { 818 | "name": "name164", 819 | "value": "value164", 820 | "other": "other164" 821 | }, 822 | "key165": { 823 | "name": "name165", 824 | "value": "value165", 825 | "other": "other165" 826 | }, 827 | "key166": { 828 | "name": "name166", 829 | "value": "value166", 830 | "other": "other166" 831 | }, 832 | "key167": { 833 | "name": "name167", 834 | "value": "value167", 835 | "other": "other167" 836 | }, 837 | "key168": { 838 | "name": "name168", 839 | "value": "value168", 840 | "other": "other168" 841 | }, 842 | "key169": { 843 | "name": "name169", 844 | "value": "value169", 845 | "other": "other169" 846 | }, 847 | "key170": { 848 | "name": "name170", 849 | "value": "value170", 850 | "other": "other170" 851 | }, 852 | "key171": { 853 | "name": "name171", 854 | "value": "value171", 855 | "other": "other171" 856 | }, 857 | "key172": { 858 | "name": "name172", 859 | "value": "value172", 860 | "other": "other172" 861 | }, 862 | "key173": { 863 | "name": "name173", 864 | "value": "value173", 865 | "other": "other173" 866 | }, 867 | "key174": { 868 | "name": "name174", 869 | "value": "value174", 870 | "other": "other174" 871 | }, 872 | "key175": { 873 | "name": "name175", 874 | "value": "value175", 875 | "other": "other175" 876 | }, 877 | "key176": { 878 | "name": "name176", 879 | "value": "value176", 880 | "other": "other176" 881 | }, 882 | "key177": { 883 | "name": "name177", 884 | "value": "value177", 885 | "other": "other177" 886 | }, 887 | "key178": { 888 | "name": "name178", 889 | "value": "value178", 890 | "other": "other178" 891 | }, 892 | "key179": { 893 | "name": "name179", 894 | "value": "value179", 895 | "other": "other179" 896 | }, 897 | "key180": { 898 | "name": "name180", 899 | "value": "value180", 900 | "other": "other180" 901 | }, 902 | "key181": { 903 | "name": "name181", 904 | "value": "value181", 905 | "other": "other181" 906 | }, 907 | "key182": { 908 | "name": "name182", 909 | "value": "value182", 910 | "other": "other182" 911 | }, 912 | "key183": { 913 | "name": "name183", 914 | "value": "value183", 915 | "other": "other183" 916 | }, 917 | "key184": { 918 | "name": "name184", 919 | "value": "value184", 920 | "other": "other184" 921 | }, 922 | "key185": { 923 | "name": "name185", 924 | "value": "value185", 925 | "other": "other185" 926 | }, 927 | "key186": { 928 | "name": "name186", 929 | "value": "value186", 930 | "other": "other186" 931 | }, 932 | "key187": { 933 | "name": "name187", 934 | "value": "value187", 935 | "other": "other187" 936 | }, 937 | "key188": { 938 | "name": "name188", 939 | "value": "value188", 940 | "other": "other188" 941 | }, 942 | "key189": { 943 | "name": "name189", 944 | "value": "value189", 945 | "other": "other189" 946 | }, 947 | "key190": { 948 | "name": "name190", 949 | "value": "value190", 950 | "other": "other190" 951 | }, 952 | "key191": { 953 | "name": "name191", 954 | "value": "value191", 955 | "other": "other191" 956 | }, 957 | "key192": { 958 | "name": "name192", 959 | "value": "value192", 960 | "other": "other192" 961 | }, 962 | "key193": { 963 | "name": "name193", 964 | "value": "value193", 965 | "other": "other193" 966 | }, 967 | "key194": { 968 | "name": "name194", 969 | "value": "value194", 970 | "other": "other194" 971 | }, 972 | "key195": { 973 | "name": "name195", 974 | "value": "value195", 975 | "other": "other195" 976 | }, 977 | "key196": { 978 | "name": "name196", 979 | "value": "value196", 980 | "other": "other196" 981 | }, 982 | "key197": { 983 | "name": "name197", 984 | "value": "value197", 985 | "other": "other197" 986 | }, 987 | "key198": { 988 | "name": "name198", 989 | "value": "value198", 990 | "other": "other198" 991 | }, 992 | "key199": { 993 | "name": "name199", 994 | "value": "value199", 995 | "other": "other199" 996 | }, 997 | "key200": { 998 | "name": "name200", 999 | "value": "value200", 1000 | "other": "other200" 1001 | }, 1002 | "key201": { 1003 | "name": "name201", 1004 | "value": "value201", 1005 | "other": "other201" 1006 | }, 1007 | "key202": { 1008 | "name": "name202", 1009 | "value": "value202", 1010 | "other": "other202" 1011 | }, 1012 | "key203": { 1013 | "name": "name203", 1014 | "value": "value203", 1015 | "other": "other203" 1016 | }, 1017 | "key204": { 1018 | "name": "name204", 1019 | "value": "value204", 1020 | "other": "other204" 1021 | }, 1022 | "key205": { 1023 | "name": "name205", 1024 | "value": "value205", 1025 | "other": "other205" 1026 | }, 1027 | "key206": { 1028 | "name": "name206", 1029 | "value": "value206", 1030 | "other": "other206" 1031 | }, 1032 | "key207": { 1033 | "name": "name207", 1034 | "value": "value207", 1035 | "other": "other207" 1036 | }, 1037 | "key208": { 1038 | "name": "name208", 1039 | "value": "value208", 1040 | "other": "other208" 1041 | }, 1042 | "key209": { 1043 | "name": "name209", 1044 | "value": "value209", 1045 | "other": "other209" 1046 | }, 1047 | "key210": { 1048 | "name": "name210", 1049 | "value": "value210", 1050 | "other": "other210" 1051 | }, 1052 | "key211": { 1053 | "name": "name211", 1054 | "value": "value211", 1055 | "other": "other211" 1056 | }, 1057 | "key212": { 1058 | "name": "name212", 1059 | "value": "value212", 1060 | "other": "other212" 1061 | }, 1062 | "key213": { 1063 | "name": "name213", 1064 | "value": "value213", 1065 | "other": "other213" 1066 | }, 1067 | "key214": { 1068 | "name": "name214", 1069 | "value": "value214", 1070 | "other": "other214" 1071 | }, 1072 | "key215": { 1073 | "name": "name215", 1074 | "value": "value215", 1075 | "other": "other215" 1076 | }, 1077 | "key216": { 1078 | "name": "name216", 1079 | "value": "value216", 1080 | "other": "other216" 1081 | }, 1082 | "key217": { 1083 | "name": "name217", 1084 | "value": "value217", 1085 | "other": "other217" 1086 | }, 1087 | "key218": { 1088 | "name": "name218", 1089 | "value": "value218", 1090 | "other": "other218" 1091 | }, 1092 | "key219": { 1093 | "name": "name219", 1094 | "value": "value219", 1095 | "other": "other219" 1096 | }, 1097 | "key220": { 1098 | "name": "name220", 1099 | "value": "value220", 1100 | "other": "other220" 1101 | }, 1102 | "key221": { 1103 | "name": "name221", 1104 | "value": "value221", 1105 | "other": "other221" 1106 | }, 1107 | "key222": { 1108 | "name": "name222", 1109 | "value": "value222", 1110 | "other": "other222" 1111 | }, 1112 | "key223": { 1113 | "name": "name223", 1114 | "value": "value223", 1115 | "other": "other223" 1116 | }, 1117 | "key224": { 1118 | "name": "name224", 1119 | "value": "value224", 1120 | "other": "other224" 1121 | }, 1122 | "key225": { 1123 | "name": "name225", 1124 | "value": "value225", 1125 | "other": "other225" 1126 | }, 1127 | "key226": { 1128 | "name": "name226", 1129 | "value": "value226", 1130 | "other": "other226" 1131 | }, 1132 | "key227": { 1133 | "name": "name227", 1134 | "value": "value227", 1135 | "other": "other227" 1136 | }, 1137 | "key228": { 1138 | "name": "name228", 1139 | "value": "value228", 1140 | "other": "other228" 1141 | }, 1142 | "key229": { 1143 | "name": "name229", 1144 | "value": "value229", 1145 | "other": "other229" 1146 | }, 1147 | "key230": { 1148 | "name": "name230", 1149 | "value": "value230", 1150 | "other": "other230" 1151 | }, 1152 | "key231": { 1153 | "name": "name231", 1154 | "value": "value231", 1155 | "other": "other231" 1156 | }, 1157 | "key232": { 1158 | "name": "name232", 1159 | "value": "value232", 1160 | "other": "other232" 1161 | }, 1162 | "key233": { 1163 | "name": "name233", 1164 | "value": "value233", 1165 | "other": "other233" 1166 | }, 1167 | "key234": { 1168 | "name": "name234", 1169 | "value": "value234", 1170 | "other": "other234" 1171 | }, 1172 | "key235": { 1173 | "name": "name235", 1174 | "value": "value235", 1175 | "other": "other235" 1176 | }, 1177 | "key236": { 1178 | "name": "name236", 1179 | "value": "value236", 1180 | "other": "other236" 1181 | }, 1182 | "key237": { 1183 | "name": "name237", 1184 | "value": "value237", 1185 | "other": "other237" 1186 | }, 1187 | "key238": { 1188 | "name": "name238", 1189 | "value": "value238", 1190 | "other": "other238" 1191 | }, 1192 | "key239": { 1193 | "name": "name239", 1194 | "value": "value239", 1195 | "other": "other239" 1196 | }, 1197 | "key240": { 1198 | "name": "name240", 1199 | "value": "value240", 1200 | "other": "other240" 1201 | }, 1202 | "key241": { 1203 | "name": "name241", 1204 | "value": "value241", 1205 | "other": "other241" 1206 | }, 1207 | "key242": { 1208 | "name": "name242", 1209 | "value": "value242", 1210 | "other": "other242" 1211 | }, 1212 | "key243": { 1213 | "name": "name243", 1214 | "value": "value243", 1215 | "other": "other243" 1216 | }, 1217 | "key244": { 1218 | "name": "name244", 1219 | "value": "value244", 1220 | "other": "other244" 1221 | }, 1222 | "key245": { 1223 | "name": "name245", 1224 | "value": "value245", 1225 | "other": "other245" 1226 | }, 1227 | "key246": { 1228 | "name": "name246", 1229 | "value": "value246", 1230 | "other": "other246" 1231 | }, 1232 | "key247": { 1233 | "name": "name247", 1234 | "value": "value247", 1235 | "other": "other247" 1236 | }, 1237 | "key248": { 1238 | "name": "name248", 1239 | "value": "value248", 1240 | "other": "other248" 1241 | }, 1242 | "key249": { 1243 | "name": "name249", 1244 | "value": "value249", 1245 | "other": "other249" 1246 | }, 1247 | "key250": { 1248 | "name": "name250", 1249 | "value": "value250", 1250 | "other": "other250" 1251 | }, 1252 | "key251": { 1253 | "name": "name251", 1254 | "value": "value251", 1255 | "other": "other251" 1256 | }, 1257 | "key252": { 1258 | "name": "name252", 1259 | "value": "value252", 1260 | "other": "other252" 1261 | }, 1262 | "key253": { 1263 | "name": "name253", 1264 | "value": "value253", 1265 | "other": "other253" 1266 | }, 1267 | "key254": { 1268 | "name": "name254", 1269 | "value": "value254", 1270 | "other": "other254" 1271 | }, 1272 | "key255": { 1273 | "name": "name255", 1274 | "value": "value255", 1275 | "other": "other255" 1276 | }, 1277 | "key256": { 1278 | "name": "name256", 1279 | "value": "value256", 1280 | "other": "other256" 1281 | }, 1282 | "key257": { 1283 | "name": "name257", 1284 | "value": "value257", 1285 | "other": "other257" 1286 | }, 1287 | "key258": { 1288 | "name": "name258", 1289 | "value": "value258", 1290 | "other": "other258" 1291 | }, 1292 | "key259": { 1293 | "name": "name259", 1294 | "value": "value259", 1295 | "other": "other259" 1296 | }, 1297 | "key260": { 1298 | "name": "name260", 1299 | "value": "value260", 1300 | "other": "other260" 1301 | }, 1302 | "key261": { 1303 | "name": "name261", 1304 | "value": "value261", 1305 | "other": "other261" 1306 | }, 1307 | "key262": { 1308 | "name": "name262", 1309 | "value": "value262", 1310 | "other": "other262" 1311 | }, 1312 | "key263": { 1313 | "name": "name263", 1314 | "value": "value263", 1315 | "other": "other263" 1316 | }, 1317 | "key264": { 1318 | "name": "name264", 1319 | "value": "value264", 1320 | "other": "other264" 1321 | }, 1322 | "key265": { 1323 | "name": "name265", 1324 | "value": "value265", 1325 | "other": "other265" 1326 | }, 1327 | "key266": { 1328 | "name": "name266", 1329 | "value": "value266", 1330 | "other": "other266" 1331 | }, 1332 | "key267": { 1333 | "name": "name267", 1334 | "value": "value267", 1335 | "other": "other267" 1336 | }, 1337 | "key268": { 1338 | "name": "name268", 1339 | "value": "value268", 1340 | "other": "other268" 1341 | }, 1342 | "key269": { 1343 | "name": "name269", 1344 | "value": "value269", 1345 | "other": "other269" 1346 | }, 1347 | "key270": { 1348 | "name": "name270", 1349 | "value": "value270", 1350 | "other": "other270" 1351 | }, 1352 | "key271": { 1353 | "name": "name271", 1354 | "value": "value271", 1355 | "other": "other271" 1356 | }, 1357 | "key272": { 1358 | "name": "name272", 1359 | "value": "value272", 1360 | "other": "other272" 1361 | }, 1362 | "key273": { 1363 | "name": "name273", 1364 | "value": "value273", 1365 | "other": "other273" 1366 | }, 1367 | "key274": { 1368 | "name": "name274", 1369 | "value": "value274", 1370 | "other": "other274" 1371 | }, 1372 | "key275": { 1373 | "name": "name275", 1374 | "value": "value275", 1375 | "other": "other275" 1376 | }, 1377 | "key276": { 1378 | "name": "name276", 1379 | "value": "value276", 1380 | "other": "other276" 1381 | }, 1382 | "key277": { 1383 | "name": "name277", 1384 | "value": "value277", 1385 | "other": "other277" 1386 | }, 1387 | "key278": { 1388 | "name": "name278", 1389 | "value": "value278", 1390 | "other": "other278" 1391 | }, 1392 | "key279": { 1393 | "name": "name279", 1394 | "value": "value279", 1395 | "other": "other279" 1396 | }, 1397 | "key280": { 1398 | "name": "name280", 1399 | "value": "value280", 1400 | "other": "other280" 1401 | }, 1402 | "key281": { 1403 | "name": "name281", 1404 | "value": "value281", 1405 | "other": "other281" 1406 | }, 1407 | "key282": { 1408 | "name": "name282", 1409 | "value": "value282", 1410 | "other": "other282" 1411 | }, 1412 | "key283": { 1413 | "name": "name283", 1414 | "value": "value283", 1415 | "other": "other283" 1416 | }, 1417 | "key284": { 1418 | "name": "name284", 1419 | "value": "value284", 1420 | "other": "other284" 1421 | }, 1422 | "key285": { 1423 | "name": "name285", 1424 | "value": "value285", 1425 | "other": "other285" 1426 | }, 1427 | "key286": { 1428 | "name": "name286", 1429 | "value": "value286", 1430 | "other": "other286" 1431 | }, 1432 | "key287": { 1433 | "name": "name287", 1434 | "value": "value287", 1435 | "other": "other287" 1436 | }, 1437 | "key288": { 1438 | "name": "name288", 1439 | "value": "value288", 1440 | "other": "other288" 1441 | }, 1442 | "key289": { 1443 | "name": "name289", 1444 | "value": "value289", 1445 | "other": "other289" 1446 | }, 1447 | "key290": { 1448 | "name": "name290", 1449 | "value": "value290", 1450 | "other": "other290" 1451 | }, 1452 | "key291": { 1453 | "name": "name291", 1454 | "value": "value291", 1455 | "other": "other291" 1456 | }, 1457 | "key292": { 1458 | "name": "name292", 1459 | "value": "value292", 1460 | "other": "other292" 1461 | }, 1462 | "key293": { 1463 | "name": "name293", 1464 | "value": "value293", 1465 | "other": "other293" 1466 | }, 1467 | "key294": { 1468 | "name": "name294", 1469 | "value": "value294", 1470 | "other": "other294" 1471 | }, 1472 | "key295": { 1473 | "name": "name295", 1474 | "value": "value295", 1475 | "other": "other295" 1476 | }, 1477 | "key296": { 1478 | "name": "name296", 1479 | "value": "value296", 1480 | "other": "other296" 1481 | }, 1482 | "key297": { 1483 | "name": "name297", 1484 | "value": "value297", 1485 | "other": "other297" 1486 | }, 1487 | "key298": { 1488 | "name": "name298", 1489 | "value": "value298", 1490 | "other": "other298" 1491 | }, 1492 | "key299": { 1493 | "name": "name299", 1494 | "value": "value299", 1495 | "other": "other299" 1496 | }, 1497 | "key300": { 1498 | "name": "name300", 1499 | "value": "value300", 1500 | "other": "other300" 1501 | } 1502 | } 1503 | --------------------------------------------------------------------------------