Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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" 項を参照してください。

jonathanh
データドライバーのCData Software Inc. の日本代表。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away