C#のSystem.Text.Jsonでオブジェクトをシリアライズしてみる。

C# コンピュータ
C#

Objet

using System.Text;
using System.Text.Json;

string path = "JsonSample01.json";
var encoding = Encoding.GetEncoding("utf-8");
using var writer = new StreamWriter(path, false, encoding);
Object obj = new();
string jsonStr = JsonSerializer.Serialize(obj);
writer.WriteLine(jsonStr);

結果

{}

Objectクラスのインスタンスをシリアライズしてみると{}になりました。JavaScriptではいろいろな意味があるらしいのですが、プロパティと値を表現したり、Dictionary型(キー付配列)を表現することが出来ます。
シンプルな配列は[]だったかと思います。中身は空ですのでこのような形になるのだと思われます。

文字列

using System.Text;
using System.Text.Json;

string path = "JsonSample01.json";
var encoding = Encoding.GetEncoding("utf-8");
using var writer = new StreamWriter(path, false, encoding);
Object obj = "文字列";
string jsonStr = JsonSerializer.Serialize(obj);
writer.WriteLine(jsonStr);

結果

"\u6587\u5B57\u5217"

Objectクラスに文字列をセットしてシリアライズしてみました。普通に文字列になっています。

数値

using System.Text;
using System.Text.Json;

string path = "JsonSample01.json";
var encoding = Encoding.GetEncoding("utf-8");
using var writer = new StreamWriter(path, false, encoding);
Object obj = 1.1d;
string jsonStr = JsonSerializer.Serialize(obj);
writer.WriteLine(jsonStr);

結果

1.1

こんどはObjectクラスに数値をセットしてシリアライズしてみます。こちらも数値が書き込まれています。

Object型でデシリアライズ

型を指定てするTにObjectを指定してなんでも受け入れられるようにしてみます。

Object obj = "ABC";
string jsonStr = JsonSerializer.Serialize(obj);
var obj2 = JsonSerializer.Deserialize<Object>(jsonStr);
Console.WriteLine(obj2?.GetType());

結果

System.Text.Json.JsonElement
JsonElementという結果になりました。
JsonElement 構造体 (System.Text.Json)
JsonDocument 内の特定の JSON 値を表します。

「JsonDocument内の特定のJSON値を表します」とのことです。組み込み型に変換するメソッドが沢山あります。

自分の理解ではJSONはJavaScriptのコードそのものですので、C#と比べてより柔軟なJavaScriptをC#に持ち込んだ際、柔軟性の部分をプログラミングで埋めてあげる必要性がありそうです。XMLと比べるとデータ量(コード量?)が少ないく見た目すっきりした印象があるJSONはとても良いとは思うのですが、調子に乗って複雑な構造を扱おうとすると自分の手に余る感じしてきました。

OpenCVの複数のフィルターをパラメータを調整しながら実行するUIを作ろうとしていて、そのデータソースとしえて複数の異なる関数(OpenCVのフィルター)を配列化することが出来ないかと試行錯誤しており、インターフェースとジェネリックなListを試してみました。UIも一応できてフィルターの親子関係もそれなりにしっくりくる形になりましたが、コードを実装しようとしたところ配列からフィルターオブジェクトを取り出したりセットするたびにキャストする必要があり、キャストの嵐になりそうなので別な方法を考えたいと思います。

コメント