JsonSerializerを使ってクラスオブジェクトをJSON文字列に変換する方法、
JSON文字列をクラスオブジェクトに変換する方法のサンプルです。
クラスオブジェクト ⇒ JSON文字列 をシリアライズ
JSON文字列 ⇒ クラスオブジェクト をデシリアライズ、と呼びます。
JsonSerializerを使うには、コードの先頭にusing System.Text.Json; を追加します。
いちいちクラスを定義するのはめんどくさいという方は、こちらの記事をどうぞ。
クラスオブジェクトをJSON文字列に変換する(シリアライズ)
JsonSerializer.Serializeメソッドを使うと引数に指定したオブジェクトをJSON文字列に変換することが出来ます。
任意で第2引数にオプション(JsonSerializerOptions)を指定することができます。
JsonSerializerOptions.WriteIndentedプロパティをtrueにすると改行、インデントされたJSON文字列が返ってきます。
JSON文字列に変換することのできる型は、
- 数値、文字列、ブール値(true、false)、DateTime型
- Dictionary<string, object>、または、Dictionary<string, JsonElement>
- 1次元配列、ジャグ配列(int[][] など)
- 次の名前空間にあるコレクション
- System.Collection
- System.Collection.Generic
- System.Collection.Immutable
などがあります。
下のサンプルではついでにJSON文字列をファイルに出力しています。
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;
class Program
{
public static void Main()
{
// Json文字列に変換するデータ
var data = new SampleData {
Data1 = false,
Data2 = 10,
Data3 = 1.23,
Data4 = "TestJson",
Data5 = new int[] { 1, 2, 3, 4, 5 },
Data6 = new List<string> { "a", "b", "c", "\"" },
Data7 = new Dictionary<string, int> {
{ "key1", 100 }, {"Key2", 200 },
},
Data8 = new SampleData_Sub {
Value1 = 99,
Value2 = 999,
},
};
// オプションを付けずにJson文字列に変換
var json_str = JsonSerializer.Serialize(data);
Console.WriteLine("オプションなしで変換");
Console.WriteLine(json_str);
// 見やすくするためにインデントオプションを付けてJson文字列に変換
var json_str_Indent = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine("オプションありで変換");
Console.WriteLine(json_str_Indent);
// Jsonファイルを出力する
File.WriteAllText("sample.json", json_str_Indent);
}
}
class SampleData
{
public bool Data1 { get; set; }
public int Data2 { get; set; }
public double Data3 { get; set; }
public string Data4 { get; set; }
public int[] Data5 { get; set; }
public List<string> Data6 { get; set; }
public Dictionary<string, int> Data7 { get; set; }
/*
* Jsonの項目名とクラスのプロパティ名に違う名前を付けるときに
* JsonPropertyName属性でJson項目名を指定する
* 「using System.Text.Json.Serialization;」 が必要
*/
[JsonPropertyName("ClassData")]
public SampleData_Sub Data8 { get; set; }
}
class SampleData_Sub
{
public int Value1 { get; set; }
public int Value2 { get; set; }
}
こんな感じに変換されます。
オプションなしで変換
{"Data1":false,"Data2":10,"Data3":1.23,"Data4":"TestJson","Data5":[1,2,3,4,5],"Data6":["a","b","c","\u0022"],"Data7":{"key1":100,"Key2":200},"ClassData":{"Value1":99,"Value2":999}}
オプションありで変換
{
"Data1": false,
"Data2": 10,
"Data3": 1.23,
"Data4": "TestJson",
"Data5": [
1,
2,
3,
4,
5
],
"Data6": [
"a",
"b",
"c",
"\u0022"
],
"Data7": {
"key1": 100,
"Key2": 200
},
"ClassData": {
"Value1": 99,
"Value2": 999
}
}
38行目でJSON文字列の内容をファイルに書き出しています。
ファイルの書き込みについてはこちらを見てください、
JSON文字列をクラスオブジェクトに変換する(デシリアライズ)
上で書きだしたJSONファイルを読み込み、内容をクラスオブジェクトに変換してみます。
変換するにはJsonSerializer.Deserializeメソッドにjson文字列を指定します。また、メソッドの型引数<T>に変換するクラス型を指定します。
JSON文字列に該当するクラスの項目がない場合は、規定値(0やnullなど)が設定されます。
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;
class Program
{
public static void Main()
{
// JSON文字列をファイルから読み込む
var json_str = File.ReadAllText("sample.json");
// JSON文字列をクラスオブジェクトに変換
var data = JsonSerializer.Deserialize<SampleData>(json_str);
}
}
class SampleData
{
public bool Data1 { get; set; }
public int Data2 { get; set; }
public double Data3 { get; set; }
public string Data4 { get; set; }
public int[] Data5 { get; set; }
public List<string> Data6 { get; set; }
public Dictionary<string, int> Data7 { get; set; }
[JsonPropertyName("ClassData")]
public SampleData_Sub Data8 { get; set; }
}
class SampleData_Sub
{
public int Value1 { get; set; }
public int Value2 { get; set; }
}
こんな感じで取り込まれました。
コピペでJSON用のクラス定義を作成
VisualStudioの「形式を選択して貼り付け」でJSON用のクラス定義を簡単に作成できるので紹介します。手順は定義を作りたいJSONをコピーして形式を選択して貼り付けをするだけです。
- まずはJSONデータをコピーして・・・
{
number : 122,
text : "YasNote",
on_off : false,
ary_num1 : [1,2,3],
ary_num2 : [1.23, 5.88],
ary_str : ["a", "b", "c"],
obj : {
str : "aaaa"
}
}
- VisualStudioで貼り付けたいところにカーソルを合わせて・・・
- メニュー「編集」⇒「形式を選択して貼り付け」⇒「JSONをクラスとして貼り付ける」
- こんな感じでクラスがぺたっとできる
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント