
JSONã¯ãïŒãïŒã·ãªã¢ã«åããããã¯ãŒã¯å
±æãããã³ã¢ãã€ã«éçºã«é¢ããŠã¯äºå®äžã®æšæºã§ãã ããããJSONã«ã©ãã ã粟éããŠããŸããïŒ ç§ãã¡ã¯çãä»æ§ãèªãã§ãã¹ããæžããå¿
èŠã«å¿ããŠäººæ°ã®ããJSONã©ã€ãã©ãªããã¹ãããŸãã JSONã¯å€ãã®äººãèããŠããããã«ãJSONã¯çæ³çãªåœ¢åŒã§ãããçæ³çãªåœ¢åŒã§ã¯ãªãããšã瀺ããŸãã åãããã«åäœãã2ã€ã®ã©ã€ãã©ãªã¯èŠã€ãããŸããã§ããã ããã«ãäž»ã«JSONã©ã€ãã©ãªã¯æéãšãšãã«é²åããä»æ§ã«åºã¥ããŠããããã極端ãªã±ãŒã¹ãæªæã®ãããã€ããŒãããã°ãã¯ã©ãã·ã¥ãããã³DoSã«ã€ãªããå¯èœæ§ãããããšãããããŸããã
1. JSONä»æ§
JSONã¯ãWebéçºãšã¢ãã€ã«éçºã®äž¡æ¹ã§ç°çš®ã¢ããªã±ãŒã·ã§ã³éã§ããŒã¿ã亀æããããã®
å
±éèªã§ããHTTPãä»ããŠããŒã¿ãéä¿¡ããéã®äºå®äžã®ã·ãªã¢ã«åã®æšæºã§ãã
2001幎ã
Douglas Crockfordã¯çããŠã·ã³ãã«ãªJSONä»æ§ãéçºããJSONã®å®å
šãªææ³ãè£ã«å°å·ããååºãäœæããŸããã

ã»ãšãã©ãã¹ãŠã®ã€ã³ã¿ãŒããããŠãŒã¶ãŒãšããã°ã©ããŒã¯JSONã䜿çšããŸãããJSONãã©ã®ããã«æ©èœãããã«ã€ããŠå®éã«åæããŠããã®ã¯ããå°æ°ã§ãã ææ³ã®ç°¡æœãã«ãããå€ãã®åŽé¢ããããŸãã«ãªããŸãã ããã«ãããã€ãã®ä»æ§ãšãã®ææ§ãªè§£éããããŸãã
Crockford
㯠JSONãããŒãžã§ã³ç®¡çããªã
ããšã«æ±ºããŸãã ã
ãããããç§ã®æãæå€ãªèšèšäžã®æ±ºå®ã¯ãJSONçªå·ããŒãžã§ã³ã®å²ãåœãŠãæåŠããããšã§ããããã®ãããå€æŽãå ããã¡ã«ããºã ã¯ãããŸããã JSONã«ãã ãã£ãŠããŸããçŸåšã®åœ¢åŒãäœã§ãããããã ãã§ãã
ããã«ãJSONã¯å°ãªããšã6ã€ã®ç°ãªãããã¥ã¡ã³ãã§å®çŸ©ãããŠããŸãã
- 2002-json.orgããã³ååºã
- 2006- IETF RFC 4627㯠ãç°å¢ã®application / json MIMEã¿ã€ããèšå®ããŸãã
- 2011- ECMAScript 262ãã»ã¯ã·ã§ã³15.12
- 2013- ECMA 404 Tim BrayïŒRFC 7159ãšãã£ã¿ãŒïŒã«ãããšã ECMAã¯ãªãªãŒã¹ãæ¥ãã ïŒ
誰ããECMAã¯ãŒãã³ã°ã°ã«ãŒãã«ãIETFã¯ã¯ã¬ã€ãžãŒã§ãããã€ã³ã¿ãŒãããå
šäœã®äºææ§ãšå
èš³ãèæ
®ããã«JSONãæžãçŽãããšããŠãããšèªããŸããã <...>ããã¯ãIETFã«ããç£æ»ã«åœ±é¿ãäžããèŠæ
ãšã¯é¢ä¿ãããŸããã
- 2014- IETF RFC 7158 ãæ
å ±ãã®ä»£ããã«ãæšæºãã©ãã¯ãä»æ§ãäœæããŸãã 123ãªã©ã®ã¹ã«ã©ãŒïŒé
åãšãªããžã§ã¯ã以å€ïŒã䜿çšã§ããECMAãªã©ã®ã«ãŒãã¬ãã«ã§trueã䜿çšã§ããŸãã ããŒã®éè€ãUnicodeæååã®ç Žæãªã©ã倱æãããœãªã¥ãŒã·ã§ã³ã®äœ¿çšã«å¯Ÿãã泚æããã ããæ瀺çã«çŠæ¢ãããŠããããã§ã¯ãããŸããã
- 2014- IETF RFC 7159 RFC 7158ã®ã¿ã€ããã¹ãä¿®æ£ããããã«çºè¡ãããŸãããããã¯2014幎3æã§ã¯ãªã2013幎3æã®æ¥ä»ã§ãã
æ確æ§ã«ãããããããRFC 7159ã«ã¯ããã€ãã®åæãå«ãŸããŠãããå€ãã®äžååãªç¹ãæ®ãããŠããŸãã
ç¹ã«ãRFC 7159
㯠ãJSONéçºã®ç®æšã¯ãJavaScriptã®ãµãã»ããããäœæããããšã§ãããšè¿°ã¹ãŠããŸãããå®éã«ã¯ããã§ã¯ãããŸããã ããšãã°ãJSONã§ã¯ãUnicode
U+2028 LINE SEPARATOR
ããã³
U+2029 PARAGRAPH SEPARATOR
ã®ãšã¹ã±ãŒããããŠããªãè¡æ«æåã䜿çšã§ããŸãã ãã ããJavaScriptä»æ§ã§ã¯ãæååå€ã«è¡æ«æåïŒ
ECMA-262-7.8.4æååãªãã©ã« ïŒãå«ããããšã¯ã§ãããäžè¬çã«ãããã®æåã«ã¯
U+2028
ããã³
U+2029
ïŒ
7.3è¡çµç«¯ èšå· ïŒãå«ãŸãããš
U+2029
ãŸãã ããã2ã€ã®æåã¯ãšã¹ã±ãŒãããã«JSONæååã§äœ¿çšã§ããJSã§ãŸã£ããæ瀺ãããŠããªããšããäºå®ã¯ãè¿°ã¹ãããéçºç®æšã«ãããããããJSONã¯JavaScriptã®ãµãã»ããã§ã¯
ãªãããšã瀺åããŠããŸãã
ãŸããRFC 7159ã¯ãJSONããŒãµãŒã極端ãªæ°å€ããããã Unicodeæååãåããªããžã§ã¯ãããŸãã¯ååž°ã®æ·±ããã©ã®ããã«åŠçããããæ確ã«ããŠããŸããã ããã€ãã®ãããããã¯ã¯æããã«å®çŸããã«æ®ãããŠããŸãããä»ã®ãããããã¯ã¯ççŸããã¹ããŒãã¡ã³ãã«èŠããã§ããŸãã
RFC 7159ã®äžæ£ç¢ºãã説æããããã«ããã¹ãJSONãã¡ã€ã«ã®ã³ã¬ã¯ã·ã§ã³ãäœæããç¹å®ã®JSONããŒãµãŒãããããåŠçããæ¹æ³ãææžåããŸããã 以äžã§ã¯ãç¹å®ã®ãã¹ããã¡ã€ã«ã解æãããã©ãããå€æããã®ã¯å¿
ãããç°¡åã§ã¯ãªãããšãããããŸãã ç§ã®ç 究ã§ã¯ããã¹ãŠã®ããŒãµãŒã®åäœãç°ãªãããããæ·±å»ãªäºææ§ã®åé¡ã«ã€ãªããå¯èœæ§ãããããšãããããŸããã
2.解æãã¹ã
次ã«ãããŒãµãŒã®åäœã確èªããããã®ãã¹ããã¡ã€ã«ã®äœææ¹æ³ã«ã€ããŠèª¬æããããã€ãã®èå³æ·±ããã¹ãã«ã€ããŠèª¬æããRFC 7159åºæºãæºããããŒãµãŒããã¡ã€ã«ãåãå
¥ãããæåŠãããããŸãã¯ç¬èªã«æ±ºå®ããããæ£åœåããŸãã
ãã¡ã€ã«åã¯ãäºæ³ãããçµæã瀺ãæåã§å§ãŸããŸãã
y
ïŒyesïŒ-解æã®æåãn
ïŒnoïŒ-解æãšã©ãŒãi
ïŒå®è£
ïŒ-å®è£
ã«äŸåããŸãã
ãŸããããŒãµãŒã®ã©ã®ã³ã³ããŒãã³ãããã¹ãããããã¯ããã¡ã€ã«ããæããã«ãªããŸãã
ããšãã°ã
n_string_unescaped_tab.json
ã¯
["09"]
ãå«ãŸããŸã-ããã¯ãæå
TAB 0x09
ãå«ãæååã®é
åã§ãJSONä»æ§ã«åŸã£ãŠãšã¹ã±ãŒãããå¿
èŠããããŸãã ãã®ãã¡ã€ã«ã¯æååã®è§£æããã¹ããããããååã«ã¯ã
structure
ã
array
ãŸãã¯
object
ã§ã¯ãªã
string
ãå«ãŸã
object
ã RFC 7159ã«ãããšãããã¯ç¡å¹ãªæååå€ã§ããããããã¡ã€ã«åã«
n
ããŠããŸãã
ããã€ãã®ããŒãµãŒã§ã¯ãããã¬ãã«ã®ã¹ã«ã©ãŒïŒ
"test"
ïŒãèš±å¯ãããŠããªããããé
åã«æååãåã蟌ãã§ããŸãïŒ
["test"]
ïŒã
JSONTestSuiteãªããžããªã«ã¯300以äžã®ãã¹ããã¡ã€ã«ããããŸãã
ã»ãšãã©ã®å Žåãç§ã¯ä»æ§ãèªã¿ãªããæåã§ãã¡ã€ã«ãäœæãã極端ãªç¶æ³ãšãããŸããªç¹ã«æ³šæãæã£ãŠããŸããã ãŸããã€ã³ã¿ãŒãããäžã«ããå€åœã®ãã¹ãã¹ã€ãŒãïŒäž»ã«
json-test-suiteãš
JSON Checker ïŒã®éçºã䜿çšããããšããŸãããããããã®ã»ãšãã©ãåºæ¬çãªç¶æ³ã®ã¿ãã«ããŒããŠããããšãããããŸããã
æåŸã«ã
American Fuzzy Lopãã¡ãžã³ã°ãœãããŠã§ã¢ã䜿çšããŠJSONãã¡ã€ã«ãçæããŸããã 次ã«ã1ã€ã®çµæã«ã€ãªããåé·ãªãã¹ããåé€ããæ®ãã®ãã¹ãã®æ°ãæžãããŠãçµæãåŸãããæå°æ°ã®æåãåŸãããããã«ããŸããïŒ
ã»ã¯ã·ã§ã³3ãåç
§ïŒã
2.1ã æ§é
ã¹ã«ã©ãŒ-æããã«ã123ããasdããªã©ã®ã¹ã«ã©ãŒã解æããå¿
èŠããããŸãã å®éã«ã¯ãå€ãã®äžè¬çãªããŒãµãŒã¯ãŸã RFC 4627ãå®è£
ããŠãããåäžã®å€ã解æããŸããã ãããã£ãŠã次ã®ãããªåºæ¬çãªãã¹ãããããŸãã
y_structure_lonely_string.json "asd"
[123,]
ã
{"a":1,}
ãªã©ã®
æ«å°Ÿã®ã³ã³ãã¯ææ³ã®äžéšã§ã¯ãªãããããã®ãããªãã¡ã€ã«ã¯ãã¹ãã«åæ Œããªãã¯ãã§ãããïŒ ããããå®éã«ã¯ãRFC 7159ã§ã¯ããŒãµãŒããæ¡åŒµãïŒ
ã»ã¯ã·ã§ã³9 ïŒããµããŒãã§ããããã«ãªã£ãŠããŸããããããã«ã€ããŠã®èª¬æã¯ãããŸããã å®éã«ã¯ãæ«å°Ÿã®ã³ã³ãã¯äžè¬çãªæ¡åŒµåã§ãã ããã¯JSONææ³ã®äžéšã§ã¯ãªããããããŒãµãŒã¯ããã
ããµããŒããã
å¿
èŠã
ãªãããããã¡ã€ã«åã¯nã§å§ãŸããŸãã
n_object_trailing_comma.json {"id":0,} n_object_several_trailing_commas.json {"id":0,,,,,}
ã³ã¡ã³ããææ³ã®äžéšã§
ã¯ãããŸããã Crockford
ã¯ããããåæã®ä»æ§ãã
åé€ããŸããã ããããããã¯å¥ã®äžè¬çãªæ¡åŒµæ©èœã§ãã äžéšã®ããŒãµãŒã§ã¯ã
[1]//xxx
ãŸãã¯çµã¿èŸŒã¿ã®
[1,/*xxx*/2]
ãéããã³ã¡ã³ãã䜿çšã§ããŸãã
y_string_comments.json ["a/*b*/c/*d//e"] n_object_trailing_comment.json {"a":"b"}/**/ n_structure_object_with_comment.json {"a":/*comment*/"b"}
ãªãŒãã³æ§é ã ãã¹ãã¯ãéããŠããæ§é ãšéããŠããªãæ§é ïŒãŸãã¯ãã®éïŒãããå Žåã®ãã¹ãŠã®ç¶æ³ãã«ããŒããŸãïŒäŸ
[
ãŸãã¯
[1,{,3]
ã æããã«ãããã¯ééãã§ããããã¹ãã«åæ Œããã¹ãã§ã¯ãããŸããã
n_structure_object_unclosed_no_value.json {"": n_structure_object_followed_by_closing_object.json {}}
å
¥ãåæ§é ã æ§é ã«ã¯ãä»ã®æ§é ãé
åãä»ã®é
åãå«ãŸããããšããããŸãã æåã®èŠçŽ ã¯ã人圢
[[[[[]]]]]
ããã«ãæåã®èŠçŽ ãé
åãªã©ã§ããé
åã«ããããšãã§ããŸãã RFC 7159ã§ã¯ãããŒãµãŒã¯ãã¹ãã®æ倧深床ã«å¶éãèšå®ã§ããŸãïŒ
ã»ã¯ã·ã§ã³9 ïŒã
ããã€ãã®ããŒãµãŒã¯æ·±ããå¶éãããããæç¹ã§åçŽã«èœã¡ãŸãã ããšãã°ãåæå
[
ãå«ã.jsonãã¡ã€ã«ãéããšãXcodeã¯ã¯ã©ãã·ã¥ããŸãã ããããã深床å¶éãJSONæ§æã»ã¬ã¯ã¿ãŒã«å®è£
ãããŠããªãããã§ãã
$ python -c "print('['*100000)" > ~/x.json $ ./Xcode ~/x.json Segmentation fault: 11
ã¹ããŒã¹ã RFC 7159ã®ææ³ã§ã¯ãå質ãšããŠ
0x20
ïŒã¹ããŒã¹ïŒã
0x09
ïŒã¿ãïŒã
0x0A
ïŒæ¹è¡ïŒãããã³
0x0D
ïŒãã£ãªããžãªã¿ãŒã³ïŒã䜿çšã§ããŸãã ãæ§é æåãã®ååŸã«ã¹ããŒã¹ãå
¥ããããšãã§ããŸã
[]{}:,
ã ãããã£ãŠã
20[090A]0D
ã¯ãã¹ãã«åæ ŒããŸãã éã«ãå
¥åãã©ãŒã
0x0C
ãŸãã¯
[E281A0]
-åèªã³ãã¯ã¿
U+2060 WORD JOINER
UTF-8æå®ãªã©ãæ瀺çã«èš±å¯ãããŠããªãããããçš®é¡ã®ã¹ããŒã¹ãå«ãããšããã¡ã€ã«ã¯ãã¹ãã«åæ ŒããŸããã
n_structure_whitespace_formfeed.json [0C] n_structure_whitespace_U+2060_word_joiner.json [E281A0] n_structure_no_data.json
2.2ã æ°å
NaNããã³Infinityã NaN
ã
Infinity
ãªã©ã®ç¹å¥ãªæ°å€ãèšè¿°ããè¡ã¯ãJSONææ³ã®äžéšã§ã¯ãããŸããã ããããäžéšã®ããŒãµãŒã¯ãããããæ¡åŒµããšèŠãªããŠåãå
¥ããŸãïŒ
ã»ã¯ã·ã§ã³9 ïŒã ãã¹ããã¡ã€ã«ã§ã¯ãåŠå®åœ¢åŒ
-NaN
ããã³
-Infinity
ããã§ãã¯ãããŸãã
n_number_NaN.json [NaN] n_number_minus_infinity.json [-Infinity]
16é²æ° -RFC 7159ã§ã¯äœ¿çšã§ããŸããã ãã¹ãã«ã¯
0xFF
ãªã©ã®æ°å€ãå«ãŸããŸãããã®ãããªãã¡ã€ã«ã¯è§£æããªãã§ãã ããã
n_number_hex_2_digits.json [0x42]
ç¯å²ãšç²ŸåºŠ -èšå€§ãªæ°ã®æ°åã¯ã©ãã§ããïŒ RFC 7159ã«ãããšããJSONããŒãµãŒã¯JSONææ³ã«å¯Ÿå¿ãããã¹ãŠã®çš®é¡ã®ããã¹ããåãå
¥ããªããã°ãªããŸãããïŒ
第9ç« ïŒã ããããåã段èœã«ã¯ããå®è£
ã«ãã£ãŠæ°å€ã®ç¯å²ãšç²ŸåºŠãå¶éãããå¯èœæ§ããããŸãããšæžãããŠããŸãã ãã®ãããããŒãµãŒã
1e9999
ã
0.0000000000000000000000000000001
ãªã©ã®å€ã«ééãããšãã«ãšã©ãŒãã¹ããŒã§ãããã©ããã¯ããããŸããã
y_number_very_big_negative_int.json [-237462374673276894279832(...)
ææ°æŠå¿µ -ãããã解æããããšã¯é©ãã»ã©é£ããã¿ã¹ã¯ã§ãïŒçµæã®ç« ãåç
§ïŒã æå¹ãªãªãã·ã§ã³ïŒ
[0E0]
ã
[0e+1]
ïŒãããã³ç¡å¹ãªãªãã·ã§ã³ïŒ
[1.0e+]
ã
[0E]
ããã³
[1eE2]
ïŒããããŸãã
n_number_0_capital_E+.json [0E+] n_number_.2e-3.json [.2e-3] y_number_double_huge_neg_exp.json [123.456e-789]
2.3ã é
å
é
åã«é¢é£ãã極端ãªç¶æ³ã®ã»ãšãã©ã¯ãééã®å¶éãšãã¹ãã®å¶éã«é¢ããåé¡ã§ãã ãããã«ã€ããŠã¯ãã»ã¯ã·ã§ã³
2.1ïŒæ§é ïŒã§èª¬æããŸãã ãã¹ãã¯
[[]
ããã³
[[[]]]
ã«åæ ŒããŸããã
]
ãŸãã¯
[[]]]
ã¯åæ ŒããŸããã
n_array_comma_and_number.json [,1] n_array_colon_instead_of_comma.json ["": 1] n_array_unclosed_with_new_lines.json [1,0A10A,1
2.4ã ãªããžã§ã¯ã
éè€ã㌠ã
RFC 7159ã®ã»ã¯ã·ã§ã³4ã«ã¯ã ããšã³ãã£ãã£å
ã«äžæã®ååãå¿
èŠã§ãããšãããŸãã ããã«ããã1ã€ã®ããŒãè€æ°åçŸãããªããžã§ã¯ãã®è§£æ
{"a":1,"a":2}
é²ãããšã¯ã§ããŸããããããŒãµãŒã¯ãã®ãããªå Žåã«äœããããã決å®ã§ããŸãã ã»ã¯ã·ã§ã³4ã§ã¯ãã[äžéšã®]å®è£
ããªããžã§ã¯ã解æäžã«ãšã©ãŒãŸãã¯èª€åäœãå ±åãããããšãŸã§èšåããŠããŸããã解æã®èª€åäœãRFCã®èŠå®ã«æºæ ããŠãããã©ãããæå®ããã«ãç¹ã«
次ã®ããã«èšè¿°ããŠããŸãã ãã
ãã®ãããªç¹æ®ãªã±ãŒã¹ã®ããªãšãŒã·ã§ã³ã«ã¯ãåãããŒãå«ãŸããŸããåãå€
{"a":1,"a":1}
ã ãã§ãªããæååã®æ¯èŒæ¹æ³ã«äŸåããããŒãŸãã¯å€ãå«ãŸããŸãã ããšãã°ãããŒã¯ãã€ããªã§ç°ãªãå ŽåããããŸãããInicode NFCæ£èŠåã«åŸã£ãŠåçïŒ
{"C3A9:"NFC","65CC81":"NFD"}
ãããã§ã¯äž¡æ¹ã®ããŒã"é "ã瀺ããŸãã
{"a":0,"a":-0}
y_object_empty_key.json {"":0} y_object_duplicated_key_and_value.json {"a":"b","a":"b"} n_object_double_colon.json {"x"::"b"} n_object_key_with_single_quotes.json {key: 'value'} n_object_missing_key.json {:"b"} n_object_non_string_key.json {1:1}
2.5ã è¡
ãã¡ã€ã«ã®ãšã³ã³ãŒãã ãJSONããã¹ãã¯UTF-8ãUTF-16ããŸãã¯UTF-32ãšã³ã³ãŒãã£ã³ã°ã§ããå¿
èŠããããŸãã ããã©ã«ãã¯UTF-8âïŒ
ã»ã¯ã·ã§ã³8.1 ïŒã
ãããã£ãŠããã¹ãã«åæ Œããã«ã¯ã3ã€ã®ãšã³ã³ãŒãã£ã³ã°ã®ãããããå¿
èŠã§ãã UTF-16ããã³UTF-32ã®ããã¹ãã«ã¯ãé«ããŒãžã§ã³ãšäœããŒãžã§ã³ãå«ããå¿
èŠããããŸãã
é害ãã¹ãã«ã¯ãISO-Latin-1ã§ãšã³ã³ãŒããããæååãå«ãŸããŸãã
y_string_utf16.json FFFE[00"00E900"00]00 n_string_iso_latin_1.json ["E9"]
ãã€ããªãŒããŒããŒã¯ ã»ã¯ã·ã§ã³8.1ã«ã¯ãå®è£
ã¯JSONããã¹ãã®å
é ã«ãã€ãã·ãŒã±ã³ã¹ããŒã«ãŒãè¿œå ãã¹ãã§ã¯ãããŸããããšèšèŒãããŠããŸããããå®è£
...ããŒã«ãŒã®ååšãç¡èŠãããšã©ãŒãšããŠæ±ããªãå ŽåããããŸããã
é害ãã¹ãã«ã¯ãUTF-8ã§ãšã³ã³ãŒããããããŒã¯ã®ã¿ãå«ãŸããä»ã®ã³ã³ãã³ãã¯å«ãŸããŸããã çµæãå®è£
åºæã®ãã¹ãã«ã¯ãUTF-8æååãå«ãUTF-8 BOMãUTF-16æååãå«ãUTF-8 BOMãUTF-8æååãå«ãUTF-16 BOMãå«ãŸããŸãã
n_structure_UTF8_BOM_no_data.json EFBBBF n_structure_incomplete_UTF8_BOM.json EFBB{} i_structure_UTF-8_BOM_empty_object.json EFBBBF{}
å¶åŸ¡æåã¯åé¢ãã
U+0000
ãšããŠ
U+001F
ãšããŠå®çŸ©ããå¿
èŠããããŸãïŒ
ã»ã¯ã·ã§ã³7 ïŒã ããã«ã¯ãä»ã®å¶åŸ¡æåå®çŸ©ã®äžéšã§ããå¯èœæ§ããã0x7F DELæåã¯å«ãŸããŸããïŒã»ã¯ã·ã§ã³4.6ãBash JSON.shãåç
§ïŒã ãããã£ãŠããã¹ãã¯
["7F"]
åæ Œããå¿
èŠããããŸãã
n_string_unescaped_ctrl_char.json ["a\09a"] y_string_unescaped_char_delete.json ["7F"] n_string_escape_x.json ["\x00"]
ã·ãŒã«ãã ããã¹ãŠã®æåããšã¹ã±ãŒãã§ããŸããïŒ
ã»ã¯ã·ã§ã³7 ïŒãããšãã°ã\ uXXXXã ãã ããåŒçšç¬Šãããã¯ã¹ã©ãã·ã¥ããšã¹ã±ãŒãæåã®äžéšã¯ãšã¹ã±ãŒãããå¿
èŠããããŸãã 倱æãããã¹ãã«ã¯ããšã¹ã±ãŒãå€ã®ãªãæåããšã¹ã±ãŒããäžå®å
šãªæåã®ãšã¹ã±ãŒããå«ãŸããŸãã äŸïŒ
["\"]
ã
["\
ã
[\
ã
y_string_allowed_escapes.json ["\"\\/\b\f\n\r\t"] n_structure_bad_escape.json ["\
ãšã¹ã±ãŒãæåã䜿çšããŠãBasic Multilingual PlaneïŒBMPïŒïŒ
\u005C
ïŒã§ã³ãŒããã€ã³ããè¡šãããšãã§ããŸãã æåãããã¹ãã«ã¯ãŒãæå
\u0000
å«ãŸããCã®ããŒãµãŒã§åé¡ãçºçããå¯èœæ§ããããŸãã倱æãããã¹ãã«ã¯ã倧æåã®U
\U005C
ã16é²æ°ä»¥å€ã®ãšã¹ã±ãŒãå€
\u123Z
ãäžå®å
šãªãšã¹ã±ãŒãå€
\u123
ãŸãã
y_string_backslash_and_u_escaped_zero.json ["\u0000"] n_string_invalid_unicode_escape.json ["\uqqqq"] n_string_incomplete_escaped_character.json ["\u00A"]
ãšã¹ã±ãŒããããéUnicodeæåBMPã®å€åŽã®ã³ãŒããã€ã³ãã¯ãUTF-16ã§ãšã³ã³ãŒããããã·ãŒã«ãããããµãã²ãŒãã«ãã£ãŠè¡šãããŸãã
+1D11E
ã¯
\uD834\uDD1E
ãŸãã JSONææ³ã®èŠ³ç¹ããæå¹ã§ãããããæåãããã¹ãã«ã¯åäžã®ä»£çãå«ãŸããŸãã RFC 7159
ã®3984ã®èª€æ€ã«ãã ããŠãã³ãŒãæåïŒ
\uDEAD
ïŒã§ã¯ãªãããŸãã¯
U+FDD0
ãã
U+FDD0
ãŸã§ã®éæåã§ã¯ãªããææ³çã«æ£ãããšã¹ã±ãŒãã³ãŒããã€ã³ãã®åé¡ã
U+10FFFE
ã
åæã«ãæ¡åŒµããã«ã¹ããŠã¢ãã©ãŒã ïŒABNFã
æ¡åŒµããã«ã¹ããŠã¢ãã©ãŒã ïŒã§ã¯ãéUnicodeã³ãŒããã€ã³ãã®äœ¿çšãèš±å¯ãããŠãããïŒã»ã¯ã·ã§ã³7ïŒãUnicodeæºæ ãå¿
èŠã§ãïŒã»ã¯ã·ã§ã³1ïŒã
ç·šéè
ã¯ãææ³ãå¶éãã¹ãã§ã¯ãªããããŒãµãŒã®åäœã®ãäºæž¬äžå¯èœæ§ãïŒ
RFC 7159ãã»ã¯ã·ã§ã³8.2 ïŒã«ã€ããŠãŠãŒã¶ãŒã«èŠåããã ãã§ååã§ãããšå€æããŸããã èšãæããã°ãããŒãµãŒã¯uã·ãŒã«ããããéæåã解æããªããã°ãªããŸããããçµæã¯äºæž¬äžèœã§ãã ãã®ãããªå Žåããã¡ã€ã«åã¯
i_
ãã¬ãã£ãã¯ã¹ã§å§ãŸããŸãïŒå®è£
ã«äŸåïŒã Unicodeæšæºã«åŸã£ãŠãç¡å¹ãªã³ãŒããã€ã³ãã¯ã眮ææå
U+FFFD REPLACEMENT CHARACTER
眮ãæããå¿
èŠããããŸãã ãã§ã«
Unicodeã®è€éãã«ééããŠããå Žåã眮æã¯ãªãã·ã§ã³ã§ãããããŸããŸãªæ¹æ³ã§å®è¡ã§ããããšã«é©ãããšã¯ãããŸããïŒ
ãŠãã³ãŒãPRïŒ121ïŒçœ®ææåã®æšå¥šãã¯ããã¯ãåç
§ïŒã ãããã£ãŠãäžéšã®ããŒãµãŒã¯çœ®ææåã䜿çšããŸãããä»ã®ããŒãµãŒã¯ãšã¹ã±ãŒãããããã©ãŒã ãæ®ãããéUnicodeæåãçæããŸãïŒ
ã»ã¯ã·ã§ã³5-ã³ã³ãã³ãã®è§£æãåç
§ïŒã
y_string_accepted_surrogate_pair.json ["\uD801\udc37"] n_string_incomplete_escaped_character.json ["\u00A"] i_string_incomplete_surrogates_escape_valid.json ["\uD800\uD800\n"] i_string_lone_second_surrogate.json ["\uDFAA"] i_string_1st_valid_surrogate_2nd_invalid.json ["\uD888\u1234"] i_string_inverted_surrogates_U+1D11E.json ["\uDd1e\uD834"]
çã®éUnicodeæååã®ã»ã¯ã·ã§ã³ã§ã¯ãæååïŒ
\uDEAD
ïŒã§çºçããéUnicodeã³ãŒããã€ã³ãã«ã€ããŠèª¬æããŸããã ãããã®ãã€ã³ãã¯uã·ãŒã«ã圢åŒã®æå¹ãªUnicodeã§ãããUnicodeæåã«ãã³ãŒããããŸããã
ããŒãµãŒã¯ãUnicodeæåããšã³ã³ãŒãããªãéåžžã®ãã€ããåŠçããå¿
èŠããããŸãã ããšãã°ãUTF-8ã§ã¯ãFFãã€ãã¯Unicodeæåã§ã¯ãããŸããã ãããã£ãŠãFFãå«ãæååå€ã¯UTF-8ã§ãšã³ã³ãŒããããæååã§ã¯ãããŸããã ãã®å Žåããæååå€ã¯0以äžã®Unicodeæåã®ã·ãŒã±ã³ã¹ãïŒ
RFC 7159ãã»ã¯ã·ã§ã³1 ïŒããã³ãJSONããã¹ãã¯Unicodeãšã³ã³ãŒãã§è¡šçŸããå¿
èŠããããïŒ
RFC 7159ã§ãããããããŒãµãŒã¯åã«è§£æãæåŠããå¿
èŠããããŸã
ãã»ã¯ã·ã§ã³8.1 ïŒã
y_string_utf8.json ["�"] n_string_invalid_utf-8.json ["FF"] n_array_invalid_utf8.json [FF]
RFC 7159ã®ãããŸãã調æ»ããç¹å®ã®ã±ãŒã¹ã«å ããŠãããŒãµãŒãRFC 7159ã®èŠä»¶ã«æºæ ããŠãããã©ããã確ç«ããããšã¯ã
ã»ã¯ã·ã§ã³9ã§è¿°ã¹ãããŠããçç±ã«ããã»ãšãã©äžå¯èœã§ãã
JSONããŒãµãŒã¯ãJSONææ³ã«äžèŽãããã¹ãŠã®ããã¹ããåãå
¥ããªããã°ãªããŸããã JSONããŒãµãŒã¯ãJSON以å€ã®ãã©ãŒã ãŸãã¯æ¡åŒµæ©èœãåãå
¥ããå ŽåããããŸãã
ãããŸã§ã®ãšããããã¹ãŠãæ確ã§ãã ãã¹ãŠã®ææ³çã«æ£ããå
¥åã解æããå¿
èŠããããããŒãµãŒã¯ä»ã®ã³ã³ãã³ããåãå
¥ãããã©ãããèªåã§æ±ºå®ã§ããŸãã
å®è£
ã«ããå¶éãããå ŽåããããŸãã
- åä¿¡ããããã¹ãã®ãµã€ãºã
- æ倧ã®ãã¹ãã®æ·±ã;
- æ°å€ã®ç¯å²ãšç²ŸåºŠ;
- æååå€ãšãã®æåã»ããã®é·ãã
ãããã®å¶éã¯ãã¹ãŠïŒæåã®äŸå€ãé€ãïŒåççã«èãããŸãããåã®åŒçšã®ãMUSTããšããèšèãšççŸããŠããŸãã
RFC 2119ã¯ãã®æå³ãéåžžã«æ確ã«èª¬æããŠããŸãã
ããå¿
èŠããããŸãã ãã®çšèªã¯ããå¿
é ããŸãã¯ãããå¿
èŠããããã®ããã«ãå¿
é ã®ä»æ§èŠä»¶ãæå³ããŸãã
RFC 7159ã¯å¶éãèš±å¯ããŠããŸãããæå°èŠä»¶ãæå®ããŠããŸããã ãããã£ãŠãæè¡çã«ã¯ã3æåããé·ãæååã解æã§ããªãããŒãµãŒã¯ãRFC 7159ã«æºæ ããŠããŸãã
ããã«ãRFC 7159ã®ã»ã¯ã·ã§ã³9ã§ã¯ãããŒãµãŒã¯å¶éãæ確ã«ææžåããããã«ã¹ã¿ã æ§æã®äœ¿çšãèš±å¯ããå¿
èŠããããŸãã ãã ãããããã®æ§æã§ã¯äºææ§ã®åé¡ãçºçããå¯èœæ§ããããããæå°èŠä»¶ãèæ
®ããããšããå§ãããŸãã
蚱容ãããå¶éã®èæ¯ã«å¯Ÿãããã®ãããªç¹ç°æ§ã®æ¬ åŠã«ãããããŒãµãŒãRFC 7159ã«äžèŽãããã©ããã確èªããããšã¯ã»ãšãã©äžå¯èœã«ãªããŸãã
3.ãã¹ãã¢ãŒããã¯ãã£
ããŒãµãŒã®åäœã«é¢ä¿ãªããããŒãµãŒã®å®éã®åäœã確èªãããã£ãã®ã§ãã ãã®ãããè€æ°ã®JSONããŒãµãŒãéžæãããã¹ããã¡ã€ã«ããã£ãŒãã§ããããã«ãã¹ãŠãæ§æããŸããã
ç§ã¯Cocoaéçºè
ãªã®ã§ãã»ãšãã©ã®ããŒãµãŒã¯SwiftãšObjective-Cã§æžãããŠããŸãã ããããCãPythonãRubyãRãLuaãPerlãBashãããã³Rustã«ã¯éåžžã«arbitrarilyæçã«éžæãããããŒãµãŒããããŸãã åºæ¬çã«ã幎霢ãšäººæ°ãå€æ§ãªèšèªãã«ããŒããããšããŸããã
äžéšã®ããŒãµãŒã§ã¯ãå¶éã匷åãŸãã¯å¶éããããUnicodeãµããŒããæ§æããããç¹å®ã®æ¡åŒµæ©èœã䜿çšãããã§ããŸãã RFC 7159ã®æãå³å¯ãªè§£éã«ã§ããã ãè¿ãåäœãããããã«ããŒãµãŒãåžžã«æ§æãããã£ãã®ã§ãã
run_tests.py
Pythonã¹ã¯ãªãã
run_tests.py
ãã¹ãŠã®ãã¹ããã¡ã€ã«ãåããŒãµãŒïŒãŸãã¯ãã¡ã€ã«ãåŒæ°ãšããŠæž¡ãããå Žåã¯åäžã®ãã¹ãïŒã§å®è¡ããŸããã éåžžãããŒãµãŒã¯ã©ãããããæåããå Žåã¯0ãè¿ãã解æã倱æããå Žåã¯1ãè¿ããŸããã ããŒãµãŒãèœã¡ãããã®åå¥ã®ã¹ããŒã¿ã¹ãšã5ç§ã®ã¿ã€ã ã¢ãŠããæäŸãããŸããã åºæ¬çã«ãJSONããŒãµãŒãJSONããªããŒã¿ãŒã«å€æããŸããã
run_tests.py
ã¯ãåãã¹ãã®æ»ãå€ãšäºæ³ãããçµæãæ¯èŒãããã¡ã€ã«åã®ãã¬ãã£ãã¯ã¹ã«åæ ããŸããã ããããäžèŽããªãã£ãå ŽåããŸãã¯æ¥é èŸã
i
ïŒå®è£
äŸåïŒã§ãã£ãå Žåã
run_tests.py
ã¯ç¹å®ã®åœ¢åŒã®è¡ããã°ã«
results/logs.txt
ïŒ
results/logs.txt
ïŒïŒ
Python 2.7.10 SHOULD_HAVE_FAILED n_number_infinity.json

次ã«ã
run_tests.py
ããã°ãèªã¿åããçµæãå«ãHTMLããŒãã«ãçæããŸãïŒ
results/parsing.html
ïŒã
åè¡ã«ã¯ãããããã®ãã¡ã€ã«ã®çµæãå«ãŸããŠããŸãã ããŒãµãŒã¯åã§è¡šç€ºãããŸãã ç°ãªãçµæã®ããã«ãç°ãªãã»ã«å¡ãã€ã¶ãã®è²ãæäŸãããŸãã

ãã¹ãã¯çµæã§ãœãŒããããŸãã ããã«ãããåæ§ã®çµæãç°¡åã«èŠã€ããŠãåé·ãªçµæãåé€ã§ããŸãã

4.çµæãšã³ã¡ã³ã
4.1ã å®å
šãªçµæ
å®å
šãªãã¹ãçµæã¯ã
seriot.ch /
json /
parsing.htmlã«ãããŸãã ãã¹ãã¯åæ§ã®çµæã§ãœãŒããããŸãã
run_tests.py
ã¯ãããã«ãŒãã³ã°ãããçµæãã衚瀺ã§ãããªãã·ã§ã³ããããŸã
run_tests.py
ãã¹ãã¹ã€ãŒãã§åãçµæãåŸãããå Žåãæåã®ãã¹ãã®ã¿ãä¿åãããŸãã ççž®ããŒã¿ãå«ããã¡ã€ã«ã¯ã
www.seriot.ch /
json /
parsing_pruned.htmlããå
¥æã§ããŸãã
å¶åŸ¡ãããªãå
¥åã解æãããšããã»ã¹å
šäœãå±éºã«ããããããããããããïŒèµ€ïŒã¯æãæ·±å»ãªåé¡ã§ãã ãäºæ³ãããæ£åžžãªå®è¡ããã¹ãïŒè¶è²ïŒãéåžžã«å±éºã§ããå¶åŸ¡ãããŠããªãå
¥åããŒã¿ã¯ãããã¥ã¡ã³ãå
šäœã®è§£æã劚ããå¯èœæ§ããããŸãã ãäºæ³ãããå®è¡ã®å€±æããã¹ãïŒé»è²ïŒã¯ããã»ã©å±éºã§ã¯ãããŸããã 圌ãã¯ã也ãããšãã§ããªããæ¡åŒµãã«ã€ããŠè©±ããŸãã ãããã£ãŠãããŒãµãŒããããã®ãæ¡åŒµãã解æã§ããªãå¥ã®ãã®ã«çœ®ãæãããããŸã§ããã¹ãŠãæ©èœããŸãã

ããã«ãæã泚ç®ãã¹ãçµæã確èªããã³ã¡ã³ãããŸãã
4.2ã CããŒãµãŒ
5ã€ã®CããŒãµãŒãéžæããŸããã
ç°¡åãªæ¯èŒè¡šïŒ

詳现ã¯ãå®å
šãªçµæè¡šã«èšèŒãããŠããŸãã
4.3ã Objective-CããŒãµãŒ
ç¹ã«AppleãiOS 5ããåã«NSJSONSerializationããªãªãŒã¹ããªãã£ããããiOSéçºã®å€æãã«éåžžã«äººæ°ã®ãã£ã3ã€ã®Objective-CããŒãµãŒãéžæããŸããã 3ã€ã®ããŒãµãŒã¯ãã¹ãŠãå€ãã®ã¢ããªã±ãŒã·ã§ã³ã®éçºã«äœ¿çšãããŠããããããã¹ãããã®ãé¢çœãã£ãã§ãã
ç°¡åãªæ¯èŒè¡šïŒ

SBJSONã¯NSJSONSerializationã®åºçŸãçã延ã³ãŸãããããŸã ãµããŒããããŠãããCocoaPodsçµç±ã§ããŠã³ããŒãã§ããŸãã ãã®ããã
ã¢ããªã±ãŒã·ã§ã³ïŒ219ã§ã¯ ã解æã["FF"]ã®ãããªUTF-8è¡ã§ãªãå Žåã«ã¯ã©ãã·ã¥ãç»é²ããŸããã
*** Assertion failure in -[SBJson4Parser parserFound:isValue:], SBJson4Parser.m:150 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: obj' *** First throw call stack: ( 0 CoreFoundation 0x00007fff95f4b4f2 __exceptionPreprocess + 178 1 libobjc.A.dylib 0x00007fff9783bf7e objc_exception_throw + 48 2 CoreFoundation 0x00007fff95f501ca +[NSException raise:format:arguments:] + 106 3 Foundation 0x00007fff9ce86856 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198 4 test_SBJSON 0x00000001000067e5 -[SBJson4Parser parserFound:isValue:] + 309 5 test_SBJSON 0x00000001000073f3 -[SBJson4Parser parserFoundString:] + 67 6 test_SBJSON 0x0000000100004289 -[SBJson4StreamParser parse:] + 2377 7 test_SBJSON 0x0000000100007989 -[SBJson4Parser parse:] + 73 8 test_SBJSON 0x0000000100005d0d main + 221 9 libdyld.dylib 0x00007fff929ea5ad start + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException
4.4. Apple (NS)JSONSerialization
developer.apple.com/reference/foundation/nsjsonserializationNSJSONSerialization iOS 5, JSON- OS X iOS. Objective-C Swift:
NSJSONSerialization.swift . Swift 3 NS
.
JSONSerialization :
- :
[123123e100000]
- u- :
["\ud800"]
JSONSerialization :
, , . .
JSON-, JSON-. , , JSONSerialization
Double.nan
. ,
NaN
JSON, JSONSerialization , .
do { let a = [Double.nan] let data = try JSONSerialization.data(withJSONObject: a, options: []) } catch let e { } SIGABRT *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid number value (NaN) in JSON write'
4.5. Freddy (Swift)
Freddy (https://github.com/bignerdranch/Freddy) â JSON-, Swift 3. «», GitHub- Swift JSON-, Apple JSONSerialization JSON- -.
Freddy , Cocoa- Swift Swift- JSON- (Array, Dictionary, Double, Int, String, Bool Null).
Freddy
2016- , . ,
[1
,
{"a":
, " ".
#199 , !
,
"0e1"
,
#198 , .
18 Freddy
["
\
.
#206 .
Freddy:

4.6. Bash JSON.sh
github.com/dominictarr/JSON.sh , 12 2016 .
Bash- , , RFC 7159, . Bash JSON , .
:cntlr:
.
[\x00-\x1F\x7F]
. JSON
0x7F DEL
.
00 nul 01 soh 02 stx 03 etx 04 eot 05 enq 06 ack 07 bel 08 bs 09 ht 0a nl 0b vt 0c np 0d cr 0e so 0f si 10 dle 11 dc1 12 dc2 13 dc3 14 dc4 15 nak 16 syn 17 etb 18 can 19 em 1a sub 1b esc 1c fs 1d gs 1e rs 1f us 20 sp 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' 28 ( 29 ) 2a * 2b + 2c , 2d â 2e . 2f / 30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 38 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ? 40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G 48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O 50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W 58 X 59 Y 5a Z 5b [ 5c \ 5d ] 5e ^ 5f _ 60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g 68 h 69 i 6a j 6b k 6c l 6d m 6e n 6f o 70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w 78 x 79 y 7a z 7b { 7c | 7d } 7e ~ 7f del
JSON.sh
["7F"]
.
. JSON.sh 10 000 [.
.
$ python -c "print('['*100000)" | ./JSON.sh ./JSON.sh: line 206: 40694 Done tokenize 40695 Segmentation fault: 11 | parse
4.7ã
C / Objective-C Swift, .
. , , , .

:
Java-, , :
JSON- Python
NaN
-Infinity
. , parse_constant , , . , .
def f_parse_constant(o): raise ValueError o = json.loads(data, parse_constant=f_parse_constant)
4.8. JSON Checker
JSON- JSON- . JSON, .
, JSON. â JSON-.
JSON_Checker.
www.json.org/JSON_checker , ():
JSON_Checker â pushdown automaton , JSON-. . JSON_Checker JSON-.
JSON_Checker , , JSON- .
, JSON_Checker , . ,
[1.]
,
[0.e1]
, JSON.
, JSON_Checker
[0e1]
, JSON-. , -
0e1
.
JSON_Checker pushdown automaton , , , .
1: 0e1 .
ZE
,
0
,
E1
e
E
. , .
2: [1.] . ,
0.
, . ,
1.
, .
JSON_Checker
FR
, . ,
FR
F0
frac0
.
1.
.

(Obj-C TouchJSON, PHP, R rjson, Rust json-rust, Bash JSON.sh, C jsmn Lua dkjson)
[1.]
. JSON_Checker? , json.org.
4.9. æ£èŠè¡šçŸ
JSON? , ,
. , , .
StackOverflow
Ruby JSON :
JSON_VALIDATOR_RE = /(
JSON, :
- u- , :
["\u002c"]
- , :
["\\a"]
( JSON-):
5.
RFC 7159 ( 9) :
JSON- JSON- .
, JSON-, .
, u- Unicode- (
"\uDEAD"
), ? - ? RFC 7159 .
0.00000000000000000000001
-0
? , ? RFC 7159 0 â0. , .
, (
{"a":1,"a":2}
)? (
{"a":1,"a":1}
)? ? Unicode-, NFC? RFC .
. â (, , JSON- ).
, . , . , . (log statements) / .
. «
».
1.000000000000000005
1.0
, Rust 1.12.0 / json 0.10.2 1.000000000000000005
1E-999
(double) 0.0
, Freddy "1E-999"
. Swift Apple JSONSerializattion Obj-C JSONKit .10000000000000000999
(Swift Apple JSONSerialization), unsigned long long (Objective-C JSONKit) (Swift Freddy). , cJSON , 10000000000000002048
( ).
ãªããžã§ã¯ã- {
"C3A9:"NFC"
, "65CC81":"NFD"
} NFC- NFD- "é". , Apple JSONSerialization Freddy, . {"a":1,"a":2}
{"a":2}
(Freddy, SBJSON, Go, Python, JavaScript, Ruby, Rust, Lua dksjon), {"a":1}
(Obj-C Apple NSJSONSerialization, Swift Apple JSONSerialization, Swift Freddy) {"a":1,"a":2}
(cJSON, R, Lua JSON).{"a":1,"a":1}
{"a":1}
, cJSON, R Lua JSON {"a":1,"a":1}
.{"a":0,"a":-0}
{"a":0}
, {"a":-0}
(Obj-C JSONKit, Go, JavaScript, Lua) {"a":0, "a":0}
(cJSON, R).
è¡["A\u0000B"]
u- 0x00 NUL
, C-. (gracefully), JSONKit cJSON . , Freddy ["A"]
( 0x00).["\uD800"]
u- U+D800
, UTF-16. , JSON. Python ["\uD800"]
. Go JavaScript " " U+FFFD REPLACEMENT CHARACTER ["EFBFBD"]
, R rjson Lua dkjson UTF-8 ["EDA080"]
. R jsonlite Lua JSON 20160728.17 ["?"]
.["EDA080"]
U+D800
, UTF-16, . UTF-8 (. 2.5. â Unicode- ). , cJSON, R rjson jsonlite, Lua JSON, Lua dkjson Ruby, ["EDA080"]
. Go JavaScript ["EFBFBDEFBFBDEFBFBD"]
, ( ). Python 2 Unicode- ["\ud800"]
, Python 3 UnicodeDecodeError
.["\uD800\uD800"]
. R jsonlite ["\U00010000"]
, Ruby- â ["F0908080"]
.
6. STJSON
STJSON â JSON-, Swift 3 600+ . , , .
github.com/nst/STJSONSTJSON API :
var p = STJSONParser(data: data) do { let o = try p.parse() print(o) } catch let e { print(e) }
STJSON :
var p = STJSON(data:data, maxParserDepth:1024, options:[.useUnicodeReplacementCharacter])
:
y_string_utf16.json
. , , , STJSON UTF-8 , , , , . STJSON , UTF-16 UTF-32.
7.
JSON â , . , :
- ( 1 );
- , RFC-7159, ( 2 );
- 30 , , , ( 4 ).
, , json_checker.c json.org JSON
[0e1]
(
4.24 ), , , . ( ) , , , .
JSON- (
6 ), JSON- RFC 7159. , pull request'.
:
- , , Apple-, Json.Net .
- JSON . , , ( 4 ). , ( 5 ). , - JSON (. 4.2.1 ).
- , JSON- JSON- -.
- (. Unicode Hacks ).
- , YAML, BSON ProtoBuf , JSON. Apple Swift- github.com/apple/swift-protobuf-plugin .
, «» HTML, CSS JSON «» PHP JavaScript . , , , , - , . .
8.
- seriot.ch/json/parsing.html , 4 .
- seriot.ch/json/transform.html , 6 .
- JSON github.com/nst/JSONTestSuite , .
- STJSON github.com/nst/STJSON , , Swift 3.