『Web API(Application Programming Interface)は、現代の「つながる世界」の大黒柱とも言えるものである。ソフトウェアは、これらのインターフェイスを使ってやりとりする。』
引用文献: 「Web API の設計」著:アルノー・ロレ 翻訳/監修:株式会社クイープ 発行:株式会社翔泳社
-----
そして、Web API でやり取りされるデータとして、近年著しく利用が進んでいるデータ形式が JSON です。他にXML、CSVなどが使われることもありますが、最近の多くの Wep API では、JSON が主流になっていることは否めません。
JSON 形式でデータを作成するときに、複数レコード(複数行)の表現がAPI仕様としてあった場合、その実現が困難なことが多いと思います。この記事では、その xoBlos での実現例を解説します。
複数レコード(複数行)のJSONデータの例
次ののような、複数レコード(複数行)を配列で表現したJSONデータを作成するケースで考えてみます。
output.json
{"Records":[ { "年度":"2020", "半期":"上期", "予算":"160" }, { "年度":"2020", "半期":"下期", "予算":"183" }, { "年度":"2021", "半期":"上期", "予算":"290" }, { "年度":"2021", "半期":"下期", "予算":"316" } ]}
JSONに変換するデータを用意する
ExcelファイルまたはCSVファイルで、JSONに変換したいデータを用意しておきます。
input.xlsx
input.csv
年度,半期,予算 2020,上期,160 2020,下期,183 2021,上期,290 2021,下期,316
XMLデータに変換する
xoBlos の手順で、XML形式に変換します。Excelファイルの場合は「Excel表から抽出」手順で、CSVファイルの場合は「変換(CSV→抽出データ)」手順を使用します。
変換後の input.xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <Root> <ROWS> <年度>2020</年度> <半期>上期</半期> <予算>160</予算> </ROWS> <ROWS> <年度>2020</年度> <半期>下期</半期> <予算>183</予算> </ROWS> <ROWS> <年度>2021</年度> <半期>上期</半期> <予算>290</予算> </ROWS> <ROWS> <年度>2021</年度> <半期>下期</半期> <予算>316</予算> </ROWS> </Root>
JSONへ変換する手順の作成方法
xoBlos のデザイナから、[新しい手順]-[コピー/削除/その他]-[XMLを任意の形式に変換] メニューを選びます。
「変換(XSLTで)」手順の設定画面が開くので、「入力ファイル名」、「出力ファイル名」、「XSLTスタイルシートファイル」の3箇所を指定します。
「XSLTスタイルシートファイル」の内容
文字コード(エンコーディング)はUTF-8で保存してください。
XMLtoJSON_Records.xslt
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="no" omit-xml-declaration="yes" method="text" encoding="UTF-8" media-type="text/x-json"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="Root">{"Records":[<xsl:apply-templates/>]}</xsl:template> <xsl:template match="ROWS">{<xsl:apply-templates/>}<xsl:if test="following-sibling::*">,</xsl:if></xsl:template> <xsl:template match="*">"<xsl:value-of select="name()"/>":"<xsl:value-of select="."/>"<xsl:if test="following-sibling::*">,</xsl:if></xsl:template> </xsl:stylesheet>
XSLTの記法・文法に関しては、ネット上の記事などを検索して参考にしてください。今回のポイントとしては、リスト要素(ノード)を連結する「,」を出力する次の箇所です。
<xsl:if test="following-sibling::*">,</xsl:if>
同じ階層の後ろに兄弟ノードがある場合に「,」で連結しています。
実行結果
output.json
{"Records":[ { "年度":"2020", "半期":"上期", "予算":"160" }, { "年度":"2020", "半期":"下期", "予算":"183" }, { "年度":"2021", "半期":"上期", "予算":"290" }, { "年度":"2021", "半期":"下期", "予算":"316" } ]}