メッセージ・マップ での異種 JSON データの変換

グラフィカル・データ・マッピング・エディターでは、 「ユーザー定義の追加」 関数を使用して異種 JSON データを変換できます。

始める前に

出力ドメインを JSONに設定して、 メッセージ・マップ を作成します。 詳しくは、 メッセージ・マップでの JSON メッセージのグラフィカルなモデル化 を参照してください。

このタスクの概要

JSON の異種データをモデル化する方法では、それぞれの構造を、使用できる各形式で提示可能なさまざまなデータのユニオンとして定義します。 その後、データを設定します。この設定手順は、データの一部のインスタンスにオプションとして表示されます。

デフォルトでは、 グラフィカル・データ・マッピング・エディターで JSON データをモデル化すると、すべてのインスタンスが同じオブジェクトと配列が作成されます。 同じ名前のオブジェクトはすべて、同じデータ・フィールド・セットを持ち、配列内のエンティティーはすべて、同じデータ・フィールド・セットを持つことになります。 このユース・ケースは、JSON データ・フォーマットの最も一般的な使用方法に対応します。

JSON では、JSON 配列内の項目に、異なる構造およびタイプを指定できます。 JSON オブジェクトの場合、 一部の JSON アプリケーションでは、含まれているオブジェクトまたは値が同じ名前であって、 別の構造とタイプを持つこともできます。 JSON 仕様の状態は次のとおり: オブジェクト SHOULD 内の名前は固有でなければなりません。 詳しくは、 The JavaScript Object Notation (JSON) Data Interchange Formatを参照してください。 この形式は、外部アプリケーションによって要求がある場合のみ使用します。 この形式の JSON データは、異種 JSON データと呼ばれます。

メッセージ・データ用の JSON スキーマがある場合は、 JSON スキーマを使用した JSON メッセージの作成または変換の説明に従って使用できます。 あるいは、このトピックで説明されているように 「ユーザー定義の追加」 機能を使用して異種 JSON データをモデル化することも、 同等の XML スキーマ・モデルを使用したメッセージ・マップで使用するための JSON メッセージのモデル化で説明されている同等の XML スキーマ・モデルを使用することもできます。

グラフィカル・データ・マッピング・エディターでは、異種 JSON 配列をモデル化する際に以下の規則が適用されます。
  • 配列内のすべての項目にオブジェクトか値のいずれかを含める必要があります。
  • Add User-Defined 関数を使用して、異種 JSON データ・オブジェクト配列をモデル化できます。
  • 異種 JSON 値の配列では、各インスタンスのタイプが異なる可能性があります。このような配列をモデル化するには、配列内の個々の値項目を表すために、外部スキーマを使用して Item エレメントのタイプを指定する必要があります。

手順

グラフィカル・データ・マッピング・エディターで異種 JSON データをモデル化するには、以下の手順を実行します。

  1. 使用可能なデータ・フィールドのユニオンを作成し、すべてのインスタンスには存在しないエレメントをオプションとして設定します。
    1. 「ユーザー定義の追加」 機能を使用して、ユーザー定義エレメントをマップに追加します。
    2. 各エレメントの 「プロパティー」 ページで、エレメントの 「一般」 タブを構成して、最小出現回数を 0 に設定し、エレメントがオプションになるようにします。

    代わりに、外部スキーマを使用して、配列内の個々の値項目を表す Item エレメントのタイプを指定することができます。 タイプは、単純タイプのスキーマ・ユニオンまたは xsd:anySimpleType として定義できます。

  2. 名前は同じであるが、型付きの異なるオブジェクトを持つ JSON オブジェクトをモデル化するには、オブジェクトを 1 回追加してから、そのカーディナリティーの 最大オカレンス を設定して、出現回数を示します。 1 つのオブジェクトは、可能なコンテンツのユニオンです。
  3. 条件マッピングを使用して、各インスタンスの出力データを読み取るか、または構成します。 詳しくは、 条件付きマッピングを定義するための変換の選択を参照してください。

    可能なタイプのユニオンとしてモデル化された異種 JSON 値にマップする場合、変換から返される入力データまたは入力値が、必ず、設定しているインスタンスに必要なタイプになるようにする必要があります。 xs:<type> キャスト関数を使用して、必要なデータ・タイプを設定することができます。

ここでは、異なる名前の値を持つ 2 つの異種 JSON データ・オブジェクトを使用する車両を記述している JSON オブジェクト・メッセージを、異種 JSON 配列メッセージに変換して項目ごとに異なる名前の値を持つデータ・オブジェクトになるようにする例を示します。

入力アプリケーションは、2 つの異種 JSON データ・オブジェクトを使用する車両を記述した 異種 JSON オブジェクト・メッセージを生成します。 各 JSON データ・オブジェクトの名前は attribute で、それぞれ異なる名前値エレメントが含まれています。 入力 JSON データを以下に示します。


{ "Description" : {
      "attribute"  : {
          "colour" : "blue",
          "metallic" : true
      },
      "attribute"  : {
          "capacity" : 1.4,
          "fuel" : "diesel"
      }
  }
}
このマップでは、Description オブジェクトは、2 回発生する可能性のある属性オブジェクト (「最大オカレンス」2 に設定) を使用してモデル化されています。
  • 異種属性オブジェクトには、名前値である colourmetallic、または capacityfuel が含まれます。
  • それぞれの名前値は、オプションとしてモデル化されます (「最小オカレンス」1 に設定)。

入力メッセージを表示します。

ターゲット・アプリケーションでは、以下の情報を異種 JSON 配列として必要とします。

[{"attributeType":"Paint","colour":"blue","metallic":true},
{"attributeType":"Engine","capacity":1.4E+0,"fuel":"diesel"}]
マップでは、出力 JSON 配列が、使用可能なデータ・フィールドのユニオンとして定義されます。
  • 配列は、タイプ Anonymous の JSON オブジェクトによって表されます。
  • 最初のエレメントは、単一の必須エレメント attributeType です。 配列内のすべての項目に、この名前値が含まれます。
  • その他の名前値エレメントには、 colourmetalliccapacity、および 消化があります。 これらのエレメントは、配列内のすべてのエンティティーに出現するわけではありません。 これらのエレメントはすべてオプションとして定義されます。 各エレメントでは、「最小オカレンス」プロパティーが 0 に設定されています。

出力メッセージを表示します。

入力から必要な出力に変換するには、For Each 変換を使用して、同じ名前が付けられた (繰り返し) 属性入力オブジェクトから、配列内の各項目を作成します。

入力メッセージと出力メッセージの間の For Each 変換を表示します

For Each 変換に関連付けられたネストされたマップの内部で、attribute エレメントに colour または capacity が含まれているかどうかをチェックする If 変換を定義します。
  1. If 条件を定義して、colour: $attribute2/colour この式が真と評価されると、If に関連付けられた、ネストされたマップ内の変換が適用されるようにします。
  2. Else パスには条件は必要ありません。 If 式が false と評価されると、Else に関連付けられたネストされたマップ内の変換が適用されます。

入力メッセージと出力メッセージの間の Append 変換のネストされたマップを示します

If 変換に関連付けられるネストされたマップは、attributeType エレメントを Paint に設定し、その他のエレメントの値は変更せずにコピーします。

入力メッセージと出力メッセージの間の Append 変換の Fist ローカル・マップを示します

Else に関連付けられるネストされたその他のマップは、attributeType エレメントを Engine に設定し、その他のエレメントの値は変更せずにコピーします。

入力メッセージと出力メッセージの間の Append 変換の 2 番目のローカル・マップを示します

このマップを実行すると、以下の JSON メッセージを受け取ります。
[{"attributeType":"Paint","colour":"blue","metallic":true},
{"attributeType":"Engine","capacity":1.4E+0,"fuel":"diesel"}]
以下のような出力ツリー構造が得られます。
  
(0x01000000:Object):JSON       = ( ['json' : 0x298f1e00]
    (0x01001000:Array):Data = (
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):attributeType = 'Paint' (CHARACTER)
        (0x03000000:NameValue):colour        = 'blue' (CHARACTER)
        (0x03000000:NameValue):metallic      = TRUE (BOOLEAN)
      )
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):attributeType = 'Engine' (CHARACTER)
        (0x03000000:NameValue):capacity      = 1.4E+0 (FLOAT)
        (0x03000000:NameValue):fuel          = 'diesel' (CHARACTER)
      )
    )
  )

次のタスク

メッセージ・マップ をデプロイし、出力メッセージが有効であることを確認します。 詳しくは、 メッセージ・マップのトラブルシューティングを参照してください。