複数レコード(複数行)のJSONデータを作成する

『Web APIApplication Programming Interface)は、現代の「つながる世界」の大黒柱とも言えるものである。ソフトウェアは、これらのインターフェイスを使ってやりとりする。』

引用文献: 「Web API の設計」著:アルノー・ロレ 翻訳/監修:株式会社クイープ 発行:株式会社翔泳社

-----

そして、Web API でやり取りされるデータとして、近年著しく利用が進んでいるデータ形式JSON です。他にXMLCSVなどが使われることもありますが、最近の多くの 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

f:id:xoblos:20211031184943p:plain

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を任意の形式に変換] メニューを選びます。 

f:id:xoblos:20210711183015p:plain

「変換(XSLTで)」手順の設定画面が開くので、「入力ファイル名」「出力ファイル名」XSLTスタイルシートファイル」の3箇所を指定します。

f:id:xoblos:20211031191848p:plain

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>

同じ階層の後ろに兄弟ノードがある場合に「,」で連結しています。

実行結果

f:id:xoblos:20211031192836p:plain

output.json

{"Records":[
  {
    "年度":"2020",
    "半期":"上期",
    "予算":"160"
  },
  {
    "年度":"2020",
    "半期":"下期",
    "予算":"183"
  },
  {
    "年度":"2021",
    "半期":"上期",
    "予算":"290"
  },
  {
    "年度":"2021",
    "半期":"下期",
    "予算":"316"
  }
]}