SlideShare une entreprise Scribd logo
1  sur  34
再帰的 正規表現JSON Validator サイボウズ・ラボ株式会社竹迫 良範<takesako@shibuya.pm.org>
(?R)
再帰的正規表現でJSON Validatorを作ってみた PCREの記法(?R)(?0)(?1)を使うテクニック $json =~ / (  *  (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"   | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)?    | true | false | null   |   (?:  (?1)  (?: , (?1)  )*  )?  *    |  (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1)      (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1)   )*)? *   )  * ) /sx ;
JSONとは
JSONとは JavaScript Object Notation JavaScriptの記法を元にしたデータ記述用言語 元々はJavaScriptのサブセットとして考案 varobj = eval(  "(" + json_text + ")"  ); JSON文字列を evalすると JavaScript object になる [     { "id" : 1001 , "name" : "foo" },      { "id" : 1002 , "name" : "bar" } ]
JavaScript で受け取った JSON を evalすると… そのまま evalするのは大変危険 「山田太郎(正常系)」 { "name" : "山田太郎=> (正常系" } 「山田  ”}),alert(24)//XSS」 { "name" : "山田"}),alert(24)//太郎" } varjson_text = (   { "name" : "  山田"}, alert(24);//XSS " } ); varobj = eval("(" + json_text + ")");
CVE-2007-3227:JSON における XSS 脆弱性 #to_jsonのHTMLエスケープ漏れでXSSが発生 http://dev.rubyonrails.org/ticket/8371
JSONの規格(データ交換フォーマット) RFC4627 による定義 The application/json Media Type forJavaScript Object Notation (JSON) ECMA-262 による定義 ECMA-262 ECMAScript言語仕様 5th edition 15.12 The JSON object [PDF] ISO/IEC 16262:2011 他のプログラミング言語の JSON parser PHP, Python, Java, Perl, C/C++... http://json.org/
JSON の構成要素 JSON string JSON number JSON array JSON object JSON value 特別な値3つ true false null
JSON string の定義 例: "abc", "", "あ", "3042" A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string.
JSON number の定義 例: 0, 1, -2, 3.14, 9e3, 9000 A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.
JSON array の定義 例:["a", "b", "c"] An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).
JSON object の定義 例:{"string": value, "key": value} An object is an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).
JSON value の定義 例:"abc", 123, {}, [], true, false, null A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested. [ [], [1, 2], ["a", "b"], {}, {"x": {"y": "z"}} ]
演習問題
Q. 以下の JSON は正しいフォーマットか? (1) JSON object のキーは "string" { apple: 1, beer: 2 } { "apple": 1, "beer": 2 }
Q. 以下の JSON は正しいフォーマットか? (2) 複数 value のカンマ区切り(最後) {   "name"   : "TAKESAKO, Yoshinori",    "E-mail" : "takesako@labs.cybozu.co.jp", } {   "name"   : "TAKESAKO, Yoshinori",    "E-mail" : "takesako@labs.cybozu.co.jp" }
Q. 以下の JSON は正しいフォーマットか? (3) JSON string の引用符は "" のみ [ 0, 1, 2, 'abc', 'string' ] [ 0, 1, 2, "abc", "string" ]
Q. 以下の JSON は正しいフォーマットか? (4) JSON number の符号に + はない [ -3, 3.14, 1.23e2, +123.456 ] [ -3, 3.14, 1.23e2,  123.456 ]
Q. 以下の JSON は正しいフォーマットか? (5) JavaScript comment は使用できない [{ /* Bookmark */   "url": "http://cybozu.co.jp/",   "memo": "Cybozu HP" // title }] [{   "url": "http://cybozu.co.jp/",   "memo": "Cybozu HP" }]
Q. 以下の JSON は正しいフォーマットか? (6) JSON number は10進数のみ [   { "file": "a.out", "chmod": 0775 },   { "file": "a.cpp", "chmod": 0644 } ] [   { "file": "a.out", "chmod": 509 },   { "file": "a.cpp", "chmod": 420 } ]
Q. 以下の JSON は正しいフォーマットか? (7) string number 以外の JSON value [ "Boolean", True, False, Null ] [ "Boolean", true, false, null ]
Q. 以下の JSON は正しいフォーマットか? (8) Unicode 文字の扱い { "a": "aあA", "i": "i3044I" } { "a":"a3042A", "i":"i3044I" }
Q. 以下の JSON は正しいフォーマットか? (9) /のエスケープ "<script src='/jquery.js'></script>" "<script src='/jquery.js'><script>"
正規表現で チェック できる?
Perl で PCRE 拡張の記法を使う (?(DEFINE)	(?<foo> regexp1)			(?<bar> regexp2) … ) (?&foo) (?&bar) $json =~ / (?(DEFINE) (?<string>  (?:[^"]* |  ["bfnrt] | u[0-9A-Fa-f]{4} )* " ) (?<number>  -? (?=[1-9]|0(?!))+(?:+)? (?:[eE] [+-]? +)? )      (?<boolean>   true | false | null ) (?<array>       (?:  (?&json)  (?: , (?&json)  )*  )?  *  )      (?<pair>      * (?&string) * : (?&json)  )      (?<object>      (?:  (?&pair)  (?: , (?&pair)  )*  )?  *  ) (?<json>  * (?: (?&number) | (?&boolean) | (?&string)  | (?&array)  | (?&object)  ) * ) )   (?&json)  /sx;
これは わかり やすい
自分自身の正規表現にマッチ (?R) PCREの記法(?R)がPerlでも使える! “{{{}}}” にマッチ “xxxx{{{}}}}}}}zzzzzz” にもマッチ 以下の正規表現だとネストしてくれない… /(?R)*/ /^ (?R)* $/
(?R)(?0)(?1)(?2)・・・が使える! 任意のキャプチャ部分の再帰ができる /(?R)*/ /(?0)*/ /((?1)*)/ /^((?1)*)$/
JSON Validator を作ってみる PCREの記法(?1)を使うテクニック $json =~ / (  *  (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"   | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)?    | true | false | null   |   (?:  (?1)  (?: , (?1)  )*  )?  *    | (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1)     )* )? *   )  * ) /sx ;
再帰的 正規表現 便利也


Contenu connexe

Similaire à 再帰的 正規表現JSON Validator

Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)
umidori
 

Similaire à 再帰的 正規表現JSON Validator (16)

JavaScriptの正規表現
JavaScriptの正規表現JavaScriptの正規表現
JavaScriptの正規表現
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
 
Ssaw08 0916
Ssaw08 0916Ssaw08 0916
Ssaw08 0916
 
Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011
 
OpenStreetMap+MongoDBで地図情報を検索してみたい!
OpenStreetMap+MongoDBで地図情報を検索してみたい!OpenStreetMap+MongoDBで地図情報を検索してみたい!
OpenStreetMap+MongoDBで地図情報を検索してみたい!
 
すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)
 
PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205
 
プログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱いプログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱い
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
MyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeMyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatype
 
ErlangでErlagVM上で動く言語の作り方
ErlangでErlagVM上で動く言語の作り方ErlangでErlagVM上で動く言語の作り方
ErlangでErlagVM上で動く言語の作り方
 
Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
 

Plus de takesako

SECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてSECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催について
takesako
 
Acme::MineChan LT demo
Acme::MineChan LT demoAcme::MineChan LT demo
Acme::MineChan LT demo
takesako
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
takesako
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
takesako
 
正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一
takesako
 
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
takesako
 
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser DetectionShibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
takesako
 

Plus de takesako (19)

SECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてSECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催について
 
Acme minechan
Acme minechanAcme minechan
Acme minechan
 
Acme::MineChan LT demo
Acme::MineChan LT demoAcme::MineChan LT demo
Acme::MineChan LT demo
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一
 
Perl6 Regex Programming with Rakudo
Perl6 Regex Programming with RakudoPerl6 Regex Programming with Rakudo
Perl6 Regex Programming with Rakudo
 
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to usThat Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
 
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
 
Perl x86 JIT Programming
Perl x86 JIT ProgrammingPerl x86 JIT Programming
Perl x86 JIT Programming
 
YAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing CeremonyYAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing Ceremony
 
HTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a PloyglotHTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a Ployglot
 
Devsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 TokyoDevsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 Tokyo
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtype
 
Shibuyajs Digest
Shibuyajs DigestShibuyajs Digest
Shibuyajs Digest
 
HTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fallHTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fall
 
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser DetectionShibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
 
Shibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnectShibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnect
 

Dernier

Dernier (10)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

再帰的 正規表現JSON Validator

  • 1. 再帰的 正規表現JSON Validator サイボウズ・ラボ株式会社竹迫 良範<takesako@shibuya.pm.org>
  • 2.
  • 4. 再帰的正規表現でJSON Validatorを作ってみた PCREの記法(?R)(?0)(?1)を使うテクニック $json =~ / ( * (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*" | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)? | true | false | null | (?: (?1) (?: , (?1) )* )? * | (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) )*)? * ) * ) /sx ;
  • 6. JSONとは JavaScript Object Notation JavaScriptの記法を元にしたデータ記述用言語 元々はJavaScriptのサブセットとして考案 varobj = eval( "(" + json_text + ")" ); JSON文字列を evalすると JavaScript object になる [ { "id" : 1001 , "name" : "foo" }, { "id" : 1002 , "name" : "bar" } ]
  • 7. JavaScript で受け取った JSON を evalすると… そのまま evalするのは大変危険 「山田太郎(正常系)」 { "name" : "山田太郎=> (正常系" } 「山田 ”}),alert(24)//XSS」 { "name" : "山田"}),alert(24)//太郎" } varjson_text = ( { "name" : " 山田"}, alert(24);//XSS " } ); varobj = eval("(" + json_text + ")");
  • 8. CVE-2007-3227:JSON における XSS 脆弱性 #to_jsonのHTMLエスケープ漏れでXSSが発生 http://dev.rubyonrails.org/ticket/8371
  • 9. JSONの規格(データ交換フォーマット) RFC4627 による定義 The application/json Media Type forJavaScript Object Notation (JSON) ECMA-262 による定義 ECMA-262 ECMAScript言語仕様 5th edition 15.12 The JSON object [PDF] ISO/IEC 16262:2011 他のプログラミング言語の JSON parser PHP, Python, Java, Perl, C/C++... http://json.org/
  • 10. JSON の構成要素 JSON string JSON number JSON array JSON object JSON value 特別な値3つ true false null
  • 11. JSON string の定義 例: "abc", "", "あ", "3042" A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string.
  • 12. JSON number の定義 例: 0, 1, -2, 3.14, 9e3, 9000 A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.
  • 13. JSON array の定義 例:["a", "b", "c"] An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).
  • 14. JSON object の定義 例:{"string": value, "key": value} An object is an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).
  • 15. JSON value の定義 例:"abc", 123, {}, [], true, false, null A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested. [ [], [1, 2], ["a", "b"], {}, {"x": {"y": "z"}} ]
  • 17. Q. 以下の JSON は正しいフォーマットか? (1) JSON object のキーは "string" { apple: 1, beer: 2 } { "apple": 1, "beer": 2 }
  • 18. Q. 以下の JSON は正しいフォーマットか? (2) 複数 value のカンマ区切り(最後) { "name" : "TAKESAKO, Yoshinori", "E-mail" : "takesako@labs.cybozu.co.jp", } { "name" : "TAKESAKO, Yoshinori", "E-mail" : "takesako@labs.cybozu.co.jp" }
  • 19. Q. 以下の JSON は正しいフォーマットか? (3) JSON string の引用符は "" のみ [ 0, 1, 2, 'abc', 'string' ] [ 0, 1, 2, "abc", "string" ]
  • 20. Q. 以下の JSON は正しいフォーマットか? (4) JSON number の符号に + はない [ -3, 3.14, 1.23e2, +123.456 ] [ -3, 3.14, 1.23e2, 123.456 ]
  • 21. Q. 以下の JSON は正しいフォーマットか? (5) JavaScript comment は使用できない [{ /* Bookmark */ "url": "http://cybozu.co.jp/", "memo": "Cybozu HP" // title }] [{ "url": "http://cybozu.co.jp/", "memo": "Cybozu HP" }]
  • 22. Q. 以下の JSON は正しいフォーマットか? (6) JSON number は10進数のみ [ { "file": "a.out", "chmod": 0775 }, { "file": "a.cpp", "chmod": 0644 } ] [ { "file": "a.out", "chmod": 509 }, { "file": "a.cpp", "chmod": 420 } ]
  • 23. Q. 以下の JSON は正しいフォーマットか? (7) string number 以外の JSON value [ "Boolean", True, False, Null ] [ "Boolean", true, false, null ]
  • 24. Q. 以下の JSON は正しいフォーマットか? (8) Unicode 文字の扱い { "a": "aあA", "i": "i3044I" } { "a":"a3042A", "i":"i3044I" }
  • 25. Q. 以下の JSON は正しいフォーマットか? (9) /のエスケープ "<script src='/jquery.js'></script>" "<script src='/jquery.js'><script>"
  • 26.
  • 28. Perl で PCRE 拡張の記法を使う (?(DEFINE) (?<foo> regexp1) (?<bar> regexp2) … ) (?&foo) (?&bar) $json =~ / (?(DEFINE) (?<string> (?:[^"]* | ["bfnrt] | u[0-9A-Fa-f]{4} )* " ) (?<number> -? (?=[1-9]|0(?!))+(?:+)? (?:[eE] [+-]? +)? ) (?<boolean> true | false | null ) (?<array> (?: (?&json) (?: , (?&json) )* )? * ) (?<pair> * (?&string) * : (?&json) ) (?<object> (?: (?&pair) (?: , (?&pair) )* )? * ) (?<json> * (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) * ) ) (?&json) /sx;
  • 30. 自分自身の正規表現にマッチ (?R) PCREの記法(?R)がPerlでも使える! “{{{}}}” にマッチ “xxxx{{{}}}}}}}zzzzzz” にもマッチ 以下の正規表現だとネストしてくれない… /(?R)*/ /^ (?R)* $/
  • 32. JSON Validator を作ってみる PCREの記法(?1)を使うテクニック $json =~ / ( * (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*" | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)? | true | false | null | (?: (?1) (?: , (?1) )* )? * | (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) )* )? * ) * ) /sx ;
  • 34.