🥴

JsonとExcelを相互に変換するツールを作ってみた

2023/01/11に公開

前置き

JsonとExcelを相互に変換するツールを作ってみました。

https://github.com/m-ishikawa1980/JXler/releases/tag/v1.0.0

背景

普段の業務で、割と大き目かつ複雑なJsonファイルを、直接中身を分析したり手を入れたりする事があるのですが、生のJsonをいじるのって何かと大変ですよね?「これどこ?」みたいなことだったり、エディタで修正してフォーマットエラーになったり。

で、なんとかしたいなと、Excelとかに変換する方法はないか?とWeb検索してみるのですが、出てくるのは、Power Queryだったり、VBAで簡単なJsonを変換したり。ちょっと自分の求めているものはありませんでした。そこで、作ってみようと思い立ったわけです。

作ったもの

サクッとJson読み込ませてExcelに変換。変換したExcelは編集したあと、またJsonに変換し戻すことができます。

特徴

  • Jsonを再帰的に解釈し、Excelに変換します。
  • 多層構造の複雑なJsonは、階層ごとにExcelのシートに分けて変換します。
  • 変換したExcelは、編集した後、再度Jsonに変換できます。

※Excelは所定のフォーマットに従って変換されます。

画面イメージ

変換イメージ

入力Json

{
    "prop1" : {
        "prop1-1" : "value1-1",
        "prop1-2" : "value1-2",
        "prop1-3" : "value1-3"
    },
    "prop2" : [
        {
            "prop2-1" : "value2-1-1",
            "prop2-2" : "value2-2-1",
            "prop2-3" : [
                {
                    "prop2-3-1" : "value2-3-1",
                    "prop2-3-2" : "value2-3-2"
                },
                {
                    "prop2-3-1" : "value2-3-3",
                    "prop2-3-2" : "value2-3-4"
                }
            ]
        },
        {
            "prop2-1" : "value2-1-2",
            "prop2-2" : "value2-2-2",
            "prop2-3" : [
                {
                    "prop2-3-1" : "value2-3-5",
                    "prop2-3-2" : "value2-3-6"
                },
                {
                    "prop2-3-1" : "value2-3-7",
                    "prop2-3-2" : "value2-3-8"
                }

            ]
        }
    ],
    "prop3" : "valu3"
}

出力Excel

同フォーマットであれば、再度Jsonに変換することが可能。

使い方とか

画面上段のDataGridにJsonをドラッグドロップして、実行ボタンをくりっくすることで変換されたExcelが出力されます。

詳しくはGitの[README]を参照してください。Excelへの変換方式などもまとめています。

技術的なこと

  • 言語 : C#
  • フレームワーク : .NET 6.0、WPF
  • 主な使用ライブラリ : ClosedXML、NewtonSoft.Json

工夫した/苦労した点

Jsonの階層ごとのタイプ判定

Jsonの多層構造をどのように解釈するのか、が今回のキモ。

課題を解決したのは、Newtonsoft.jsonのJTokenクラス。このクラスのプロパティに、JTokenTypeというのがありまして、このクラスにJsonをデシリアライズすると、今の階層のJsonのタイプを判定できます。階層ごとにタイプを判定→タイプごとの処理を実施、というのを再帰的に処理することで多層構造を解釈・処理することを実現しました。

Excelへの反映方式

Excelは、編集したあと再度Jsonに変換させる必要があります。そのためExcelからもJTokenTypeのように今の各シート(=階層)がどのタイプか、を判定する必要がありました。

ここは正直苦肉の策、といってもいいかもしれませんが、各シート(=階層)にその属性情報を記すため、A1セルに強制的にメモを登録、そこに「Object」「Array」と固定文字を指定することにしました。シートごとにA1セルのメモを判断、処理のタイプを判定することで、こちらも再帰的にJsonへ変換することを実現しました。(正直、もうちょっとうまいやりかたがなかったかと反省ポイント)

何かいいアイディアはないか・・

アプリ名

まぁ、この辺のセンスは皆無でして「JsonExcelConverter」みたいなのしようかと思ったんですが、そこはちょっとこだわってみようと、こちらのサイトでいろいろ検討しました。

で決めたのがこちら

JXler

どーなんでしょうか。。。

今後

Jsonを扱う技術はそこかしこにあるので、いろいろ応用ができそうな気はしています。今なんとなく考えていますのは、WebAPIを実行するツールとしてExcelを介してできないか、なんて考えています。が、いつになるかは未定。

GitHub Sponsors

僭越ながら、GitHub Sponsorsをつけてみました。チャリンチャリンいただけると大変うれしいです。

Discussion