ExcelやCSVの表を、APIへの登録やシステムへの取り込み用に決められた形式のJSONへ変換したいとき、表の列名をそのままキーにする変換では形が合わないことがよくあります。JSON生成ツールを使うと、列ごとに「JSONのどこに入れるか」と「数値・真偽値などの型」を決めるだけで、入れ子や配列を含むJSONをプログラムなしで作れます。この記事では、商品とSKU(色・サイズ別の在庫)の2つのシートがあるExcelファイルを例に、実際の画面で手順を説明します。

表をそのままJSONにしても形が合わない理由

一般的なCSV → JSONの変換では、1行が1つのオブジェクトになり、列名がそのままキーになります。この記事の例の表を変換すると、次のようになります。

[
  {
    "商品コード": "0101",
    "商品名": "ドライTシャツ",
    "価格": "1980",
    "タグ1": "新商品",
    "タグ2": "セール",
    "公開": "はい"
  }
]

一方、APIの仕様書などで指定されるJSONは、たいてい次のような点で表と形が違います。

  • キーの名前が違う:表は「商品名」、JSONは name のように英語のキーを使う。
  • 入れ子になっている:価格を "price": {"amount": 1980} のようにオブジェクトの中に入れる。
  • 配列になっている:表では「タグ1」「タグ2」と横に並んだ列を、"tags": ["新商品", "セール"] のような配列にする。
  • 別の表の行が中に入る:別シートのSKUを、商品ごとに variants の配列として入れる。
  • 型が決まっている:価格は数値の 1980、公開は true / false にする。表の値はすべて文字として扱われるため、変換が必要。
  • 表にない値がある:通貨 "JPY" や表示順の番号、全体の version など。

JSON生成ツールでは、これらを項目ごとの設定で指定できます。

この記事の例:元の表と作りたいJSON

Excelファイルに「商品」と「SKU」の2つのシートがあります。商品コードの「0101」は先頭の0を残すため、Excelでは文字列として入力しています。

シート「商品」

商品コード商品名価格タグ1タグ2公開
0101ドライTシャツ1,980新商品セールはい
0102リネンシャツ4,500新商品はい
0103デニムパンツ6,800定番いいえ

シート「SKU」

商品コードSKU色サイズ在庫数
01010101-WH-MホワイトM12
01010101-WH-LホワイトL0
01010101-BK-MブラックM5
01020102-BE-MベージュM3
01030103-ID-30インディゴ308

作りたいJSONは次の形です。products の中に3つの商品が同じ形で並びます(ここでは1件目だけを示しています)。

{
  "version": 1,
  "products": [
    {
      "id": "0101",
      "name": "ドライTシャツ",
      "price": {
        "amount": 1980,
        "currency": "JPY"
      },
      "tags": [
        "新商品",
        "セール"
      ],
      "published": true,
      "sortOrder": 1,
      "variants": [
        {
          "sku": "0101-WH-M",
          "color": "ホワイト",
          "size": "M",
          "stock": 12
        },
        {
          "sku": "0101-WH-L",
          "color": "ホワイト",
          "size": "L",
          "stock": 0
        },
        {
          "sku": "0101-BK-M",
          "color": "ブラック",
          "size": "M",
          "stock": 5
        }
      ]
    }
  ]
}

列とJSONの位置の対応をまとめると、次のようになります。

シート「商品」の商品コード・商品名・価格・タグ1とタグ2・公開を、id・name・price.amount・tags[0]とtags[1]・publishedに対応させ、表にない固定値JPYをprice.currency、連番をsortOrderに入れる。シート「SKU」のSKU・色・サイズ・在庫数は子ブロックにして商品コードで関連付け、variantsの中のsku・color・size・stockに入れる。versionはテンプレートに書く
表の列とJSONの位置の対応(模式図)。画像を選ぶと拡大できます。

同じ操作を試したい場合は、サンプルファイルをダウンロードして使えます。データはすべて架空のものです。

手順1:Excelファイルを読み込む

JSON生成ツールを開き、「1 データ(表)」の[CSV・Excelファイルを選択]からExcelファイルを選びます。シートが複数あるため、使うシートを選ぶ画面が表示されます。「商品」と「SKU」の両方にチェックが入っていることを確認して、[選んだシートを表として追加]を押します。

「products-sku.xlsx」のシートを選んでくださいという画面で、商品(4行×6列)とSKU(6行×5列)にチェックが入り、選んだシートを表として追加ボタンが表示されている
シートを選ぶ画面。行数は列名の行を含みます。画像を選ぶと拡大できます。

2つのシートが表として追加され、最初のシート「商品」の列をそのまま項目にしたブロックが「2 JSONの組み立て」に自動で作られます。「ブロック」は、1つの表から作るJSONの一部のことです。読み込んだ表は画面上で確認・編集できます。

手順2:全体の形(テンプレート)と配置先を決める

まず、JSONの一番外側の形を「全体のJSON(テンプレート)」に書きます。version のように表と関係のない固定の値もここに書きます。

{
  "version": 1,
  "products": []
}

テンプレートを書いた時点では、次のメッセージが表示されます。自動で作られたブロックの「配置先」が空欄で、ブロックがJSON全体になる設定のままだからです。

次の点を修正してくださいという欄に、ブロック「商品」は配置先が空欄のため、JSON全体になります。テンプレートに書いた値の中に入れるには、配置先を入力してください、というメッセージが表示されている
配置先が空欄のときに表示されるメッセージ。画像を選ぶと拡大できます。

ブロック「商品」の「配置先」に products と入力します。これで、商品の配列がテンプレートの "products": [] の場所に入ります。形は「オブジェクトの配列(1行=1件)」のままにします。

ブロック「商品」で、データ元が表「商品」、形がオブジェクトの配列(1行=1件)、配置先が全体のJSONの中に入れる、配置先の入力欄にproductsと入力されている
配置先に products を入力したところ。画像を選ぶと拡大できます。

テンプレートに "products": [] と書かなくても、配置先の場所は自動で作られます。テンプレートに書いておくと、完成形が分かりやすくなります。

手順3:列ごとにJSONの位置と型を決める

ブロック「商品」には、表の列がそのまま項目として並んでいます。各項目の「JSON上の位置」を書き換え、「型」と「空欄のとき」を次の表のとおりに設定します。

値(表の列)JSON上の位置型空欄のとき
商品コードid文字列"" にする(初期設定)
商品名name文字列"" にする
価格price.amount数値"" にする
タグ1tags[0]文字列出力しない
タグ2tags[1]文字列出力しない
公開published真偽値"" にする
ブロック「商品」の項目一覧。idは商品コード・文字列、nameは商品名・文字列、price.amountは価格・数値、price.currencyは固定値JPY、tags[0]とtags[1]はタグ1とタグ2で空欄のとき出力しない、publishedは公開・真偽値になっている
項目の設定。price.currency は手順4で追加する固定値の項目です。画像を選ぶと拡大できます。

位置の書き方

  • price.amount のように「.」で区切ると、price オブジェクトの中に amount が入ります。
  • tags[0] の [0] は配列の1番目、[1] は2番目です。横に並んだ列を1つの配列にまとめられます。

型と空欄の考え方

  • 商品コードは「文字列」のままにします。「数値」にすると、"0101" が 101 になってしまいます。
  • 価格は「数値」にすると、"1980" ではなく 1980 として出力されます。Excelで「1,980」と表示されていても、ファイルには1980として保存されているため、そのまま数値になります。
  • 公開は「真偽値」にすると、「はい」が true、「いいえ」が false になります。true/false、1/0、yes/no も変換できます。
  • タグは空欄のとき「出力しない」にします。リネンシャツはタグ2が空欄のため、["新商品", ""] ではなく ["新商品"] になります。

手順4:表にない値(固定値・連番)を追加する

通貨の "JPY" のように、すべての商品で同じ値は「固定値」で追加します。ブロック「商品」の[+ 項目を追加]を押し、追加された項目の「JSON上の位置」に price.currency、「値」で「固定値」を選んで JPY と入力します。↑のボタンで price.amount の下に移動すると、JSONでもその順番になります。

表示順の番号 sortOrder は「連番」で作ります。もう一度[+ 項目を追加]を押し、位置に sortOrder、「値」で「連番」を選びます。開始1・増分1のままなら、1, 2, 3 と番号が付き、型は自動で「数値」になります。

sortOrderの値が連番で、開始1・増分1・桁数0。その下のvariantsの値がSKUを入れるになっていて、この表(商品)の列と子の表(SKU)の列がどちらも商品コードになっている
連番の sortOrder と、手順5で設定する variants の項目。画像を選ぶと拡大できます。

連番の「先頭の文字」と「桁数(0埋め)」を使うと、ITEM-001 のようなIDも作れます。作成日時などは「日時の連続」、重複しないIDは「UUID(一意のID)」で追加できます。

手順5:別シートのSKUを入れ子にする(子ブロック)

SKUのように、1つの商品に複数の行がある別の表は「子ブロック」にして、商品の中に入れます。

  1. 「1 データ(表)」で「SKU」のタブを選んでから、[+ ブロックを追加]を押します。表「SKU」の列を項目にしたブロックが追加されます。
  2. 追加したブロック「SKU」の「配置先」で「子ブロックとして別のブロックに入れる」を選びます。
  3. 商品コードは商品側にあるため、ブロック「SKU」の「商品コード」の項目は×で削除します。残りの項目の位置を sku・color・size・stock に変え、在庫数の型を「数値」にします。サイズの「30」は文字として扱いたいため、「文字列」のままにします。
  4. ブロック「商品」に戻って[+ 項目を追加]を押し、位置に variants、「値」で「SKUを入れる」を選びます。
  5. 「この表(商品)の列」と「子の表(SKU)の列」で、両方とも「商品コード」が選ばれていることを確認します。同じ名前の列は自動で選ばれます。
ブロック「SKU」に子ブロックの表示があり、配置先が子ブロックとして別のブロックに入れる、「商品」の項目で使われていますと表示されている。項目はskuがSKU、colorが色、sizeがサイズ(文字列)、stockが在庫数(数値)
子ブロックにしたブロック「SKU」。どのブロックから使われているかも表示されます。画像を選ぶと拡大できます。

これで、商品コードが同じSKUの行だけが、各商品の variants に配列として入ります。SKUが1つもない商品は "variants": [] になります。

手順6:プレビューで確認してJSONを生成する

「3 出力」のプレビューに、設定どおりのJSONが表示されます。プレビューは各ブロックの先頭3件だけを使って表示します。形を確認したら[JSONを生成]を押し、ファイル名を入力して[ダウンロード]を押します。[コピー]でクリップボードにコピーすることもできます。

出力形式が整形で、プレビューにversion 1とproductsの1件目(id 0101、price.amount 1980、currency JPY、tagsの配列、published true、sortOrder 1、variants)が表示され、JSONを生成のあとに、生成しました:商品3件(1.5 KB)、ファイル名products、コピーとダウンロードのボタンが表示されている
プレビューと生成後の画面。生成すると件数とファイルサイズが表示されます。画像を選ぶと拡大できます。

2件目のリネンシャツは、タグが1つだけ、SKUが1つだけのJSONになります。

{
  "id": "0102",
  "name": "リネンシャツ",
  "price": {
    "amount": 4500,
    "currency": "JPY"
  },
  "tags": [
    "新商品"
  ],
  "published": true,
  "sortOrder": 2,
  "variants": [
    {
      "sku": "0102-BE-M",
      "color": "ベージュ",
      "size": "M",
      "stock": 3
    }
  ]
}

データを更新して作り直すとき

ブロックやテンプレートの設定はブラウザに保存されます。商品が増えたときなどは、更新したExcelファイルを同じように読み込みます。同じ名前の表(シート)がすでにあるため、内容を置き換えるかを確認するメッセージが表示されます。[OK]を選ぶと表の中身だけが新しくなり、ブロックの設定はそのまま使えるので、[JSONを生成]を押すだけで作り直せます。

表の列は名前で対応させます。列名を変えたり列を削除したりした場合は、その列を使っていた項目がエラーになるため、項目の「値」で列を選び直してください。

うまくいかないときの確認ポイント

設定に問題があると、プレビューの下に「次の点を修正してください」と表示され、JSONは生成されません。よくあるメッセージと直し方です。

表示されるメッセージ(例)原因直し方
ブロック「商品」は配置先が空欄のため、JSON全体になります。…テンプレートに値があるのに、ブロックの配置先が空欄配置先に products などの位置を入力する
表「商品」の2行目、ブロック「商品」の項目「price.amount」:「4,500円」は数値に変換できません。数値にしたい列に「円」などの文字が入っているExcelで単位を消して数字だけにする。単位付きのまま出力したい場合は型を「文字列」にする
ブロック「商品」で、「price」と「price.amount」の位置が重なっています(値の中に別の項目を入れることはできません)。price に値を入れつつ、その中に amount も入れようとしているどちらかの位置を変える(例:price を price.amount にする)
ブロック「商品」で、項目「name」が重複しています。同じ位置の項目が2つある片方の位置を変えるか、不要な項目を削除する

エラーにならないのに結果が期待と違う場合は、次も確認してください。

  • variants が空の配列になる:関連付けに使う列の値が一致していません。商品の表は「0101」、SKUの表は「101」のように、先頭の0が片方だけ消えていないか確認します。前後の空白は無視して比べます。
  • 商品コードの先頭の0が消えている:Excelで数値として入力されていると、ファイルにも101として保存されています。Excelでセルの書式を「文字列」にして入力し直してください。
  • キーの順番が仕様書と違う:項目の↑↓で並べ替えると、JSONのキーもその順番になります。

元の表がCSVの場合

CSVの場合も手順は同じです。シートの代わりに、商品とSKUを別々のCSVファイルにしておき、[CSV・Excelファイルを選択]で2つのファイルをまとめて選びます。表の名前はファイル名(例:products、skus)になり、子ブロックの値は「skusを入れる」のように表示されます。表の名前は「表の名前」の欄で変更できます。

Excelで保存したShift_JISのCSVも、文字コードを自動で判定して読み込みます。区切り文字がカンマ以外(タブやセミコロン)でも自動で判定します。

作ったJSONを確認する

生成したJSONは、取り込み先の仕様と照らし合わせて確認しておくと安心です。構文や重複キー、階層の深さはJSON 総合診断で、見た目の整形や圧縮はJSON 整形で確認できます。取り込みでエラーになる場合は、JSONをインポートできない原因も参考にしてください。

列名をそのままキーにするだけで十分な場合は、より手軽なCSV → JSONツールも使えます。