C#でJSONの基本操作を行う
C#によるJSON操作です。C#ではJSONオブジェクトの代わりにコレクションの1つであるDictionaryを使用して連想配列の形で操作します。.NET Core 2.0以上であればSystem.Text.Jsonパッケージ、それ以前であればJSON.NETを利用します。本記事ではSystem.Text.Jsonパッケージを利用してJSON操作をしていきます。
目次 Table of Contents
JSON文字列とオブジェクトの相互変換
C#ではJSONオブジェクトをコレクションのひとつであるDictionaryを使って連想配列として操作します。とりあえず基本的な操作として、Json文字列とJSONオブジェクト(連想配列)の相互変換をしてみます。
public partial class Form1 : Form
{
List<Label> listLabel = new List<Label>();
public Form1()
{
InitializeComponent();
for (int i = 0; i < 20; i++)
{
Label label = new Label();
label.Location = new Point(0, 20 * i);
label.AutoSize = true;
listLabel.Add(label);
this.Controls.Add(label);
}
//JSON文字列とオブジェクトの相互変換———————————–
//シリアライズ(Dictionary→string)
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add(“name”, “ryoma”);
parameters.Add(“description”, “Hello JSON on C#”);
var jsonString = JsonSerializer.Serialize(parameters);
listLabel[0].Text = “label0 : ” + jsonString;
//デシリアライズ(string→Dictionary)
var jsonString2 = “{\”name\”:\”ryoma\”, \”hobby\”:\”programming\”}”;
var json = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString2);
int iJson = 1;
foreach (var item in json)
{
listLabel[iJson].Text = “label” + iJson.ToString() + ” : ” + “(key, value) => ” + “(” + item.Key + “, ” + item.Value + “)”;
iJson++;
}
}
}
JSONデータの型については後述しますが、Keyをstring型、ValueをObject型として取得しています。デシリアライズすると値の型はJsonElement型として返ってきます。Object型で受け取ればキャストできますがstring型などで受け取るとキャストできないので、基本Object型で受け取るのがいいかと思います。
ネストがあるJSONの操作
続いてはネストが含まれているJSONデータの取り扱いです。またJSONファイルから読み込みも合わせて載せておきます。
//ネストの場合——————————————————-
//シリアライズ(入れ子Dictionary→string)
Dictionary<string, object> innerParams = new Dictionary<string, object>();
innerParams.Add(“sex”, “man”);
innerParams.Add(“hobby”, “programming”);
Dictionary<string, object> paramsA = new Dictionary<string, object>();
paramsA.Add(“name”, “ryoma”);
paramsA.Add(“description”, “Hello”);
paramsA.Add(“object”, innerParams);
var jsonString3 = JsonSerializer.Serialize(paramsA);
listLabel[3].Text = “label3 : ” + jsonString3; //{“name”:”ryoma”,”description”:”Hello”,”object”:{“sex”:”man”,”hobby”:”programming”}}
//デシリアライズ(string→入れ子Dictionary)
var json2 = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString3);
iJson = 4;
foreach (var item in json2)
{
listLabel[iJson].Text = “label” + iJson.ToString() + ” : ” + “(key, value) => ” + “(” + item.Key + “, ” + item.Value + “) : valueの型は ” + item.Value.GetType();
iJson++;
}
listLabel[7].Text = “label7 : ” + “json2[\”description\”] => ” + json2[“description”];
listLabel[8].Text = “label8 : ” + “json2[\”object\”] => ” + json2[“object”];
var json3 = JsonSerializer.Deserialize<Dictionary<string, object>>(json2[“object”].ToString());
iJson = 9;
foreach (var item in json3)
{
listLabel[iJson].Text = “label” + iJson.ToString() + ” : ” + “(key, value) => ” + “(” + item.Key + “, ” + item.Value + “) : valueの型は ” + item.Value.GetType();
iJson++;
}
ネストされているオブジェクトを文字列化してデシリアライズすることでJSONオブジェクトとして扱えました。
//JSONファイルを読み込んでオブジェクト化———————————–
try
{
using (StreamReader reader = new StreamReader(@”JSONファイルのパス”, Encoding.GetEncoding(“UTF-8”)))
{
var jsonString4 = reader.ReadToEnd();
var json4 = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString4);
iJson = 11;
foreach(var item in json4)
{
listLabel[iJson].Text = “label” + iJson.ToString() + ” : ” + “(key, value) => ” + “(” + item.Key + “, ” + item.Value + “) : valueの型は ” + item.Value.GetType();
iJson++;
}
}
} catch(IOException e)
{
//省略
}
JSONのデータ型について
前述しましたが、デシリアライズして取得したJSONのValueはJsonElement型で返ってきます。
→Microsoft 公式ドキュメント
JsonElementクラスのValueKindフィールドにはJSONデータ型を表す列挙型が入っています。データ型が不明なJSONを扱うときはこれで型判別を行えばよさそうです。下記コードでは連想配列を使っていますが、ファイルから読み込んだ場合でも同様にValueKindの型が付与されます。
//Jsonデータ型について
Dictionary<string, object> innerParams2 = new Dictionary<string, object>();
innerParams2.Add(“name”, “ryoma”);
innerParams2.Add(“description”, “Hello World”);
string[] innerArray = new string[]
{
“apple”,
“orange”,
“banana”
};
Dictionary<string, object> json5 = new Dictionary<string, object>();
json5.Add(“name”, “ryoma”);
json5.Add(“number”, 138);
json5.Add(“authenticity”, true);
json5.Add(“object”, innerParams2);
json5.Add(“array”, innerArray);
string jsonString5 = JsonSerializer.Serialize(json5);
var json6 = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString5);
iJson = 13;
foreach(var item in json6)
{
listLabel[iJson].Text = “label” + iJson.ToString() + ” : ” + “(key, value) => ” + “(” + item.Key + “, ” + item.Value + “) ValueKind : ” + ((JsonElement)item.Value).ValueKind;
iJson++;
}