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

# 前置き
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は所定のフォーマットに従って変換されます。

#### 画面イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/212484b0-f711-aca6-ae72-bb495545b652.png)



# 変換イメージ
### 入力Json
```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
![208299767-2ade4f70-4b2b-473f-beaf-00fead746c9b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/7aff41b8-b92b-f637-40a8-9ce74f440743.png)
同フォーマットであれば、再度Jsonに変換することが可能。

# 使い方とか

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

詳しくはGitの[[README]](https://github.com/m-ishikawa1980/JXler/blob/master/README.md)を参照してください。Excelへの変換方式などもまとめています。

# 技術的なこと

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

# 工夫した/苦労した点

### Jsonの階層ごとのタイプ判定
Jsonの多層構造をどのように解釈するのか、が今回のキモ。  

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

### Excelへの反映方式

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

ここは正直苦肉の策、といってもいいかもしれませんが、各シート（＝階層）にその属性情報を記すため、A1セルに強制的にメモを登録、そこに「Object」「Array」と固定文字を指定することにしました。シートごとにA1セルのメモを判断、処理のタイプを判定することで、こちらも再帰的にJsonへ変換することを実現しました。（正直、もうちょっとうまいやりかたがなかったかと反省ポイント）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/5171a031-108d-6482-792a-ab0acdcc5525.png)
何かいいアイディアはないか・・

### アプリ名

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

で決めたのがこちら
##### JXler

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

# 今後

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

# GitHub Sponsors

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