訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
parse関数は、JSONテキスト(JSON書式化文字列)を解析し、ECMAScriptの値を生成します。 JSONフォーマット(書式)には、ECMAScriptのリテラルによる制限があります。 JSONのオブジェクトは、ECMAScriptのオブジェクトとして理解されます。 JSONの配列は、ECMAScriptの配列として理解されます。 JSONの文字列、数値、ブール(ブーリアン)、null は、ECMAScriptの文字列、数値、ブール(ブーリアン)、nullとして理解されます。 JSONは、エスケープシーケンスを使用することなく、直接 JSONString 内に現れる、より限定した WhiteSpace 以外のホワイトスペース文字の集合とUnicodeコードポイント U+2028 及び U+2029 を許容します。 解析の処理は、JSONの文法による制約を持たせた 11.1.4 と 11.1.5 に似ています。 オプションの reviver パラメータは、2つのパラメータ( key と value )を取る関数です。 それは、結果をフィルタし、変換することが可能です。 それは、解析により処理した key / value のペアのそれぞれを伴って呼ばれ、その戻り値は、オリジナルの値の代わりに使用されます。 それが、受け取ったものを返す場合、その構造は、変更されません。 それが、undefinedを受け取る場合、そのプロパティは、その結果から削除されます。
1. JText は、 ToString(text) とする 2. 15.12.1 にある文法を使って JText を解析する JText が、目標記号 JSONText における JSON の文法と一致しない場合、SyntaxError例外を投げる(スローする) 3. unfiltered は、ECMAScriptのプログラムのソーステキストだったが、StringLiteral の 場所で JSONString を使用中であるかのように JText を解析、評価した結果とする JText からJSONの文法との一致における注釈として、この結果は、任意の ArrayLiteral や任意の ObjectLiteral の何れかによって定義される任意の原始的な(プリミティブ)値や任意のオブジェクトの何れかになるでしょう。 4. IsCallable(reviver) が、 true である場合、 a. root は、その名を伴う標準組み込みコンストラクタである Object について式 new Object() によるかのように生成した新たなオブジェクトとする b.引数としてカラの文字列、PropertyDescriptor {[[Value]]: unfiltered, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}、 false を伴う root の内部メソッド[[DefineOwnProperty]]を呼ぶ c. root とカラの文字列を解析し、抽象操作Walkを呼んだ結果を返す 抽象操作 Walk は、以下で説明される 5.それ以外の場合、 a. unfiltered を返す
抽象操作 Walk は、holder オブジェクトとそのオブジェクトにあるプロパティとしてString型の name という2つのパラメータ取る再帰的な抽象操作です。 Walk は、上記のparse関数に渡した元となった reviver の値を使用します。
1. val は、引数 name を伴う holder の内部メソッド[[Get]]を呼んだ結果とする 2. val が、オブジェクトである場合、 a. val の内部プロパティ[[Class]]が、"Array" である場合、 i. I に 0 を設定する ii. len は、引数"length"を伴う val の内部メソッド[[Get]]を呼んだ結果とする iii. I < len である間、繰り返す 1. newElement は、 val と ToString(I) を渡して抽象操作 Walk を呼んだ結果とする 2. newElement が、 undefined である場合、引数として ToString(I) と false を伴う val の内部メソッド[[Delete]]を呼ぶ 3.それ以外の場合、 a 引数 ToString(I)、プロパティ記述子 {[[Value]]: newElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}、 false を伴う val の内部メソッド[[DefineOwnProperty]]を呼ぶ 4. I に 1 を追加する b.それ以外の場合、 i. keys は、[[Enumerable]]属性が、trueである val の自身のプロパティ全ての名称から成るString値である内部リストとする 文字列の順番は、標準組み込み関数 Object.keys によって使用したものと同じにすべきである ii. keys 内のString P ごとに実行 1. newElement は、 val と P を渡して抽象操作 Walk を呼んだ結果とする 2. newElement が、 undefinedである場合、引数として P と false を伴う val の内部メソッド[[Delete]]を呼ぶ 3.それ以外の場合、 a 引数 P 、プロパティ記述子 {[[Value]]: newElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}、 false を伴う val の内部メソッド[[DefineOwnProperty]]を呼ぶ 3. this 値としての holder と name と val から成る引数リストを共に渡し、 reviver の内部メソッド[[Call]]を呼んだ結果を返す
JSONの文法を拡張する為の JSON.parse の実装との一致については許可されません。 実装が、JSONの内部変換書式を変更または拡張したサポートをしたい場合、別途parse関数を定義することによってそれをしなければいけません。 [注釈] 任意のオブジェクト内でname文字列が重複することがあるケースについては、同一のキーにおいて語彙的に先行する値は、上書きするようにしましょう。