サンプル: JSON を CSV に変換する

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  データソースとターゲット > JSON >

サンプル: JSON を CSV に変換する

このサンプルは JSON ファイルからデータを読み取る方法、および、 MapForce を使用してコンマで区切られたテキストファイルに変換する方法について説明しています。また、このサンプルでは JSON インスタンスファイル内で存在する可能性のある追加プロパティからデータをマップする方法について学びます。 スキーマにより定義されていませんが、追加プロパティは JSON インスタンスファイル内に存在するデータを参照しています。ルールとして、追加プロパティに頼らず、 JSON スキーマ内ですべてのプロパティを定義します。 JSON インスタンスが追加プロパティを含む場合でも、このサンプル内で説明されているテクニックを使用することができます。

 

このサンプルには以下のパスで見つけることのできるデモマッピングファイルが存在します: <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\\ReadJSON.mfd。下のステップに従い、最初からこのようなマッピングファイルの作成方法を学ぶことができます。

 

ソース JSON ファイルには、 CSV に変換される必要のあるメンバーの記録が含まれています。ハイライトされているテキストに注意してください: 最初と2番目のスキーマ内で定義されていない追加プロパティ(具体的には birthday)が存在します。

 

[

 {

         "name": "Alethia Alonso",

         "email": "altethia@example.com",

         "age": 35,

         "birthday": "4 July"

 }, {

         "name": "Klaus Mauer",

         "email": "klaus@example.com",

         "age": 57,

         "birthday": "31 August"

 }, {

         "name": "Natsuo Shinohara",

         "email": "natsuo@example.com",

         "age": 29

 }        

]

People.json

このサンプル内で使用されている JSON スキーマは以下に表示されています。$schema キーワードが示す通り、スキーマは Draft 04 JSON Schema に対して JSON インスタンスを検証しています。複数の person オブジェクトにより構成されている people 配列に関して説明しています。 people オブジェクトは少なくとも1つの有効な person オブジェクトを含んでいる必要があります。各 person オブジェクトには name、 age、 および email がプロパティとして存在します。nameemailstring の型を持ち、ageinteger の型を持っています。また、 nameemail プロパティは必須ですが、 age は任意です。

 

{

 "$schema": "http://json-schema.org/draft-04/schema#",

 "title": "people",

 "type": "array",

 "items": {

 "title": "person",  

 "type": "object",

   "required": [

     "name",

     "email"

   ],  

   "properties": {

     "name": {

       "type": "string"

     },

     "email": {

       "type": "string",

       "format": "email"

     },

     "age": {

       "type": "integer"

     }

   }

 },

 "minItems": 1

}

People.schema.json

重要な点は、上記の JSON スキーマは person オブジェクトのために additionalProperties プロパティを持っていない点です。JSON スキーマに存在しない場合、 additionalProperties プロパティはデフォルトの値として、 true の値を持つことです。これは、 JSON インスタンス内のオブジェクトは必要とされる数の追加プロパティを持ち有効であることができる点です。 このため、 People.json のような JSON インスタンスファイルはこのスキーマに対しての検証に成功することができます。

 

このサンプルのマッピングの目的を達成するには、以下のステップに従ってください。

 

ステップ 1: JSON ファイルをマッピングに追加する方法

1.「挿入」 メニューから「JSON スキーマ/ファイル」をクリックし、次のファイルを参照します: <マイ ドキュメント>\Altova\MapForce2019\MapForceExamples\Tutorial\People.schema.json。 インスタンスを指定するようにプロンプトされると、同じフォルダー内から People.json ファイルを選択します。 この時点では、 MapForce コンポーネントは以下のようになります:

mf_json_01

MapForce コンポーネントの構造は プロパティ (追加) ノードの例外を持つ JSON ファイル自身に類似しています。 このノードは、 person オブジェクトの additionalProperties プロパティがスキーマ内で不足しているか、 true に設定されていることを示しています。これは、スキーマは追加プロパティを含むことができ、オブジェクトの追加プロパティをマップする場合に MapForce がノードを表示できることを意味します (次のステップ上記の実行ステップが示されています)。

 

ソース JSON ファイル、または、 JSON スキーマファイルを変更する場合、JSON コンポーネントのタイトルバーをダブルクリックし、設定を引き出します。 JSON コンポーネント設定 を参照してください。

 

ステップ 2. ターゲット CSV をマッピングに追加する方法

1.「挿入」 メニューから「テキストファイル」をクリックします。

mf_json_02

2.「標準 CSV のための単純な処理 」 を選択して、「継続」をクリックします。

mf_json_03

3.「フィールドを追加」 を数回クリックして、4つの CSV フィールドを上記の通り追加します。 「OK」 をクリックします。

 

テキストコンポーネントに関する詳細は、 CSV とテキストファイル を参照してください。

 

ステップ 3: マッピング接続の描き方

1.マッピング上で、 JSON コンポーネントと CSV コンポーネント間に接続線を下に示されている通り描きます。

mf_json_04

詳細に関しては、 接続との作業 を参照してください。

 

ステップ 4: マッピングをプレビューする方法

「出力」 タブをクリックして、変換出力を素早く確認することができます。結果は以下の通りです:

 

Alethia Alonso,altethia@example.com,35,

Klaus Mauer,klaus@example.com,57,

Natsuo Shinohara,natsuo@example.com,29,

 

出力が表示するとおり、JSON ファイル内の個人のオブジェクトのために新規の行が作成され、予想されるとおり、オブジェクトプロパティがコンマで区切られて表示されています。

 

しかしながら、JSON インスタンスファイル内に存在し、スキーマ内に存在しない birthday フィールドはマップされていません。

 

ステップ 5: 追加プロパティをマップする方法

フィールド birthday はスキーマ内で定義されていない追加プロパティであることを思いだしてください。このようなフィールドからのデータを読み取るために、 MapForce は JSON コンポーネント上に追加アイテムを提供します。

 

このサンプルでは、 birthday フィールドからデータを読み取るためには、以下をマッピングに追加します:

 

1.値 「birthday」を持つ定数。 マッピングに定数を追加する を参照してください。
2.フィルターコンポーネント。 フィルターと条件 を参照してください。
3.ロジカルな関数 equalマッピングにビルトイン関数を追加する を参照してください。

 

次に、コンポーネントを以下に示されるように接続します。コンポーネントをこの方法で接続すると、名前 birthday を持つ追加プロパティを検索するように MapForce に命令します。文字列の値が見つかると、テキストコンポーネントの Field4 にコピーされます。

mf_json_05

上記のマッピングでは、プロパティ (追加) の下の name アイテムにより、名前別に追加プロパティにアクセスできるようになります。JSON データ型に対応する次のアイテム (stringnumberboolean など) は JSON データ型に対応します。 その型の実際 JSON 値にアクセスするために使用されます。 サンプル内では、追加プロパティの名前は、「birthday」であり、型は「string」です。このためにこれら2つのアイテムはフィルターに接続されています。

 

変換出力をプレビューすると、結果は以下の通りです:

 

Alethia Alonso,altethia@example.com,35,4 July

Klaus Mauer,klaus@example.com,57,31 August

Natsuo Shinohara,natsuo@example.com,29,

 

出力が示す通り、 4番目の CSV フィールドには、型「string」 の追加プロパティの値のみが含まれています。この場合は birthday です。また、3番目の個人には誕生日が存在しなく、対応する箇所の CSV では値を使用することができません。


(C) 2019 Altova GmbH