1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CData Software User GroupAdvent Calendar 2016

Day 20

JSON やXML データをCDataドライバーでJDBC, ODBC, ADO.NET で利用する方法

Posted at

#JSON, XML が苦手な方へ#
多くのモダンデータストアはJSON かXML ベースのWeb API を通じて利用されます。すでに長く使われてスタンダートとして安定しているフォーマットです。 ただし、カスタム業務システムや帳票・BI などの各種ツールでは、RDB を基本としたデータソース・フォーマットにしか対応していないというケースが多いのではないでしょうか? 今後も使っていくシステムではあるけれど、改修を行うのにもコストがかかるし、エンジニアもJSON の修得には時間が。そんなとき頼りになるCData のJDBC, ODBC, ADO.NET ドライバーですが、生憎自分が使いたいWeb API のドライバーが製品化されていない。 そこでCData JSON Driver、CData XML Driver を使って、JSON およびXML フォーマットで提供されているWeb API に対してカスタムスキーマを設定することでデータドライバーとして利用することができます。
スキーマ設定はちょっと上級者向けですが、組織内で一人がスキーマ定義を行えば、同じスキーマファイルを利用して、組織・コミュニティ全員がWeb API をテーブル型のデータとして開発環境および、BI, 帳票ツール、Excel から使えるようになります。

#使いたいJSON, XML データのモデル化#
正しくJSON またはXML をデータベースとして読むためには、「テーブル」として表示させたい各エンドポイントに対してスキーマを定義します。 初めてテーブル名を決めます。次にパースしたいJSON/XML エレメント毎に名前をふっていきます。 そして「テーブル」のユニークなプライマリーキーとなるエレメントを定義し、繰り返しとなるエレメントを定義して「行」に均し、パースするリソースの位置を定義します。

##JSONの例##

{
"person": [
{
"id": 1754,
"name": "Joe Smith",
"address": {"street": "9th Street", "city": "New York", "state": "NY"},
"children": ["John", "Sarah", "Elizabeth"],
"birthday": "1960-01-01"
},
{
"id": 1755,
"name": "Jane Doe",
"address": {"street": "8th Avenue", "city": "New York", "state": "NY"},
"children": ["Adam", "Bailey"],
"birthday": "1960-07-01"
},
...
]     
}

このJSON を下のようにスキーマ定義します:

<rsb:info title="Person" desc="Parse a document into rows.">
<!-- Column definitions -->
  <attr name="ID"             xs:type="int" key="true" other:xPath="id" /> 
  <attr name="Name"           xs:type="string"         other:xPath="name" />
  <attr name="Address_Street" xs:type="string"         other:xPath="address/street" />
  <attr name="Address_City"   xs:type="string"         other:xPath="address/city" />
  <attr name="Address_State"  xs:type="datetime"       other:xPath="address/state" />
  <attr name="Child1"         xs:type="string"         other:xPath="children[0]" />
  <attr name="Child2"         xs:type="string"         other:xPath="children[1]" />
  <attr name="Child3"         xs:type="string"         other:xPath="children[2]" />
</rsb:info>

<rsb:set  attr="RepeatElement"  value="/json/person/" />
<rsb:set  attr="uri"            value="PersonData.json" />

#Read / Write 処理の設定#
スキーマのカラム定義を作成したら、次はスキーマに様々なスクリプトを書き込むことで、必要なSQL クエリ(SELECT, INSERT, UPDATE, DELETE) が使えるようにしましょう。

処理 SQL スキーマメソッド
Read SELECT GET
Create INSERT POST
Update UPDATE MERGE
Delete DELETE DELETE
<rsb:script method="GET">
  <rsb:call op="jsonproviderGet">
    <rsb:push />
  </rsb:call>
</rsb:script>
  
<rsb:script method="POST">
  <rsb:call op="jsonproviderGet">
    <rsb:push />
  </rsb:call>
</rsb:script>
  
<rsb:script method="MERGE">
  <rsb:call op="jsonproviderGet">
    <rsb:push />
  </rsb:call>
</rsb:script>

<rsb:script method="DELETE">
  <rsb:call op="jsonproviderGet">
    <rsb:push />
  </rsb:call>
</rsb:script>

これで、定義したスキーマにおいて、指定されたURI でデータを処理できるように設定ができました。さらに複雑なクエリ(ソートや、グルーピングなど)は 製品ヘルプの"Modeling XML Data" 項を参照してください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?