ENTMF 

付録 C - JSON PARSE の照合アルゴリズム

解析処理は名前照合アルゴリズムで制御されます。このアルゴリズムでは、JSON テキストで基本レベル全体またはグループ レベル全体の省略が許容されることを除き、COBOL データ構造が JSON テキスト文字列と正確に一致する必要があります。

JSON 名と COBOL データ名の間の名前の照合では、大文字と小文字は区別されません。つまり、JSON 名と COBOL データ名のいずれについても、小文字の 1 バイトの英字 (a から z) は対応する大文字の 1 バイトの英字 (A から Z) と等しいものと見なされます。ただし、NAME 指定がある場合は、NAME 指定のリテラルがコンパイラによって Unicode UTF-8 に変換された後に、そのリテラルが大文字と小文字の区別も含めて JSON 名と正確に一致する必要があります。

JSON PARSE 文は、identifier-2 に従属する各基本データ項目に対して適切に修飾された JSON の名前と値のペア (JSON テキスト内の順序は関係ない) が 1 つだけ一致する場合は例外なしで終了し、特殊レジスタの JSON-STATUS および JSON-CODE にゼロが格納されます。

それ以外の場合は、実行時の状況に応じて、JSON-STATUS の値がゼロ以外になったり、例外が発生して JSON-CODE の値がゼロ以外になったりすることがあります。たとえば、JSON 値と COBOL データ型の組み合わせが無効な場合は文が例外条件で終了します。

COBOL グループ/基本項目のいずれのデータ項目名とも一致しない JSON の名前と値のペアがある場合、それ自体は許容されますが、特殊レジスタ JSON-STATUS が条件コードに設定され、WITH DETAIL が指定されていれば 1 つ以上のランタイム メッセージも出力されます。

一致する COBOL データ項目がない場合、文は例外条件で終了し、COBOL グループ/基本項目は変更されません。

次に、名前照合アルゴリズムで一致すると見なされる例と一致しないと見なされる例を示します。

特殊な値の true および false はサポートされておらず、受信側のデータ項目と照合する JSON 名の値として使用されていると例外条件が発生します。

次の 2 つの例は完全に一致すると見なされます。

COBOL データ定義:

01.Grp-1.03 a. 05 grk pic x(15).05 8_ pic 9.05 A-a pic x(5).

JSON テキスト:

{"grp-1": {"A": {"GrK": "ERK*VML", "8_": 8, "a-A": "VOID"}}}

JSON GENERATE 文を使用した場合、この COBOL データ定義を指定すると次の JSON テキストが生成されます。このテキストも上記の JSON テキストと完全に一致すると見なされます。

{"Grp-1": {"a": {"grk": "ERK*VML", "8_": 8, "A-a": "Void"}}}

JSON テキストで構造体の特定の要素が省略されている場合も、レベルが一致していれば、COBOL データ定義と JSON テキストを照合することができます。たとえば、次の例では JSON テキストで基本項目 8_ およびグループ項目 AddTxt が省略されていますが、この場合も一致すると見なされます。JSON PARSE の処理では、それらの 2 つの項目については構造体で変更されず、値が 1 の JSON-STATUS が生成されます (WITH DETAIL 指定がある場合はランタイム メッセージも生成されます)。

COBOL データ定義:

01.Grp-1.03 a. 05 grk pic x(15).05 8_ pic 9.05 A-a pic x(5).03 AddTxt.05 dt pic 9(6).05 not pic x(50).

JSON テキスト:

{"grp-1": {"A": {"GrK": "ERK*VML", "a-A": "VOID"}}}

反対に、JSON テキストに追加の項目がある場合、許容はされますがゼロ以外の JSON-STATUS コードおよびランタイム メッセージが生成されます。次の例は互換性があり、JSON PARSE の処理で Grp-1 が完全に取り込まれますが、JSON の名前と値のペア "X-X": "Y" は変更されません。文は例外コードなしで終了しますが、特殊レジスタ JSON-STATUS が理由コード 2 に設定されます。

01.Grp-1.03 a. 05 grk pic x(15).05 8_ pic 9.05 A-a pic x(5).

JSON テキスト:

{"grp-1": {"A": {"GrK": "ERK*VML", "8_": 8, "X-X": "Y", "a-A": "VOID"}}}

次の 2 つの例についても、項目の順序は一致していませんが、完全に互換性があると見なされます。

01.Grp-1.03 a. 05 grk pic x(15).05 8_ pic 9.05 A-a pic x(5).

JSON テキスト:

{"grp-1": {"A": {"a-A": "VOID", "GrK": "ERK*VML", "8_": 8}}}

一方、次の 2 つの例については、JSON テキストにグループ項目 a に対応する名前がないため、互換性があると見なされません。この処理では、変更するデータ項目がないため、例外条件が発生します。

01.Grp-1.03 a. 05 grk pic x(15).05 8_ pic 9.05 A-a pic x(5).

JSON テキスト:

{"grp-1": {"a-A": "VOID", "GrK": "ERK*VML", "8_": 8}}

次の 2 つの例についても、JSON テキストの値と対応する COBOL データ定義の値に互換性がないため、互換性があると見なされません。この処理では例外条件が発生します。

01.Grp-1.03 a. 05 grk pic x(15).05 8_ pic 9.05 A-a pic x(5).

JSON テキスト:

{"grp-1": {"A": {"GrK": 33, "8_": "eight", "a-A": 657}}}

JSON 名に COBOL データ名で使用が許可されていない文字が含まれている場合は、NAME 指定を使用して COBOL データ名として使用できるエイリアスを指定します。たとえば、次の JSON 名は COBOL データ名として使用できません。

{"x>z":250}

この場合、JSON PARSE 文で NAME 指定を使用して有効な COBOL 名 (my-sub) を指定することで、JSON 値を引き続き処理することができます。

JSON PARSE j-text into j-data NAME OF my-sub is "x>z" END-JSON.

NAME 指定を使用する際は、JSON 名を JSON 文字列に含まれるとおりに正確に指定する必要があります。他の照合アルゴリズムとは異なり、大文字と小文字は区別されません。また、NAME 指定にあいまいな名前の指定があってはなりません。