JsonとExcelを相互に変換するツールを作ってみた
前置き
JsonとExcelを相互に変換するツールを作ってみました。
背景
普段の業務で、割と大き目かつ複雑な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