C#でJSONのデシリアライズ


このご時世、兎にも角にも猫も杓子もJSONだよな。Javascriptだったら何も考えずに使えるんだけれども、C#でJSONなデータを受け渡す時にちょっと詰まったので、その時に試したことをメモしとこう。

今回俺がやりたかったのは、JSONデータのデシリアライズだ。もう俺みたいなおっさんになってくると横文字がよく分からんくなってくるのだが、「デシリアライズ」ってのはJSONオブジェクトを手元で使いやすいように復元する作業のことを指すようだ。

C#でJSONを扱うには、標準ライブラリでもできなくはないのだが、「Json.NET」とかいうのが評判良さそうなのでそいつを使ってみることにした。Json.NETはNuGet(パッケージマネージャ的なやつ)でサクッと導入できるが、もし宗教上の理由とかでNuGet使えなくてもゴリ押しでDLLを直接インポートで問題ないだろう。

型指定でデシリアライズしてみる

とりあえず愚直にやるんだったら、パース対象のデータを、予め用意しといた入れ物(クラスをインスンタンス化奴)にぶちこんでやればいいみたいだ。

こんな感じに実装してみた。「json_text」にベタ書きしてるデータは実際だとファイルなりHTTPなりで持ってくるところになるだろう。座標っぽいデータを持った「item」と、そいつらを複数個持ってる「items」に分けたデータがあるとして、そいつの入れ物をそれっぽく作ってみた。

[Single Item]
x:32,y:32
[Multiple Item]
x:64,y:64
x:128,y:128
x:256,y:256

出力結果はこんな感じ。手探りだから正解か知らんけど、とりあえずは動いてるようだ。しかしやってみて思ったが、なんかこう、入れ物を作り置きしとくの超めんどいな。Javascriptで扱うときみたいに、型とか気にせず楽に書けないもんかね?

型指定せずにデシリアライズしてみる


と思って調べてたら、普通にあるじゃん!

JObjectとかいうのにパースした結果をぶちこんでやって、SelectToken/SelectTokensの引数に検索条件を入れたらデータを抽出できる。どうやら、検索条件のところはXMLでいうところのXPathならぬ「JsonPath」とかいう書き方で指定すればいいらしい。

しかしこのJsonPath、ググってもググっても全然情報出てこないからちょっと書くのにも一苦労だった。JsonPathというモノ自体は10年以上前からあるっぽいのだけれど、あんまり需要ないんだろうかね?まあ、実際そんな複雑な事しないからいいんだけど。

[Single Item]
x:32,y:32
[Multiple Item]
x:64,y:64
x:128,y:128
x:256,y:256
[Filtered Item]
x:32,y:32
x:64,y:64

ちなみに、実行結果はこんな感じ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)