本記事は、[C#での設定ファイル管理とパラメータのバージョンアップ]の続きとして、JSONのSerializeとDeSerializeによる設定情報やパラメータの扱いについて記載します。JsonのSerializeとDeserializeは、設定ファイル管理において扱いやすい特徴があり、さらにファイルサイズや速度面で現在はXMLのSerializeより多く使わています。
Contents
Ⅰ. System.Text.JsonのSerializeを使う方法
説明で使うXMLファイル
1 2 3 4 5 6 7 8 9 |
{ "ID": 1002, "Name": "Suzuki", "Grades": { "Kokugo": 31, "Suugaku": 36, "Eigo": 78 } } |
説明で使うデータクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ParamUserInfo { public int ID { get; set; } public string Name { get; set; } public ParamUserGrade Grades { get; set; } = new ParamUserGrade(); } public class ParamUserGrade { public int Kokugo { get; set; } public int Suugaku { get; set; } public int Eigo { get; set; } } |
System.Text.Jsonによる設定ファイルへ書き込み
.net標準で入っているSystem.Text.Jsonを使ってJsonファイルを読み書きする方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System.Text.Json; public static void JsonSerialize<T>(T data, string jsonfile) { var options = new JsonSerializerOptions { WriteIndented = true, }; using (var stream = new FileStream(jsonfile, FileMode.Create, FileAccess.Write)) { //Newtonと同じ名なのでぶつかる JsonSerializer.SerializeAsync(stream, data, options); } } |
System.Text.Jsonによる設定ファイルからの読み込み
1 2 3 4 5 6 |
using System.Text.Json; public static T JsonDeserialize<T>(string jsonfile) { var jsonString = File.ReadAllText(jsonfile); return JsonSerializer.Deserialize<T>(jsonString); } |
Ⅱ. DataContractJsonSerializerを使う方法
XML DataContractSerializerと似ています。試してみたら、メンバー順番が変わっても正常にDeserializeできました。ということで、XML DataContractSerializerより、こちらが良いですね。
DataContractJsonSerializerによる設定ファイルへ書き込み
1 2 3 4 5 6 7 8 9 10 11 |
using System.Runtime.Serialization.Json; public static void JsonDataContractSerialize<T>(T data, string jsonfile) { using (var fs = new FileStream(jsonfile, FileMode.Create)) using (var writer = JsonReaderWriterFactory.CreateJsonWriter(fs, Encoding.UTF8, true, true, " ")) { var serializer = new DataContractJsonSerializer(typeof(T)); serializer.WriteObject(writer, data); } } |
DataContractJsonSerializerによる設定ファイルからの読み込み
1 2 3 4 5 6 7 8 9 |
using System.Runtime.Serialization.Json; public static T JsonDataContractDeserialize<T>(string jsonfile) { using (var ms = new FileStream(jsonfile, FileMode.Open)) { var serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(ms); } } |
あまり変わりませんが、以下の方法でも可能です。
1 2 3 4 5 6 7 8 9 10 11 |
public static T JsonDataContractDeserialize_2<T>(string jsonfile) { using (var fs = new FileStream(jsonfile, FileMode.Open)) { var serializer = new DataContractJsonSerializer(typeof(T)); using (var jsonReader = JsonReaderWriterFactory.CreateJsonReader(fs, XmlDictionaryReaderQuotas.Max)) { return (T)serializer.ReadObject(jsonReader); } } } |
呼び出し側
1 2 3 4 5 6 7 8 |
var jsonfile2 = @"c:\temp\JsonDataContractSerialize.json"; var userData = UtilitySerialize.JsonDataContractDeserialize<Param_SerializeJson.ParamUserInfo>(jsonfile2); //アプリケーション中で値変更 userData.ID = 2002; UtilitySerialize.JsonDataContractSerialize<Param_SerializeJson.ParamUserInfo>(userData, jsonfile2); var userdata2 = UtilitySerialize.JsonDataContractDeserialize_2<Param_SerializeJson.ParamUserInfo>( jsonfile2); |
Newtonsoft.Json.JsonSerializerによる方法
System.Text.JsonのSerializeとクラスがJsonSerializerの同じ名称ですが、名前空間が違います。Newtonsoft.Json.JsonSerializerは、オープンソースであることからNuGetとか取得する必要があります。ただ、DataContractJsonSerializerより2倍ぐらい早いこと、また、扱い方が簡単である特徴があります。
Newtonsoft.Json.JsonSerializerによる設定ファイルへ書き込み
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using Newtonsoft.Json.JsonSerializer; public static void JsonNewtonSerialize<T>(T data, string jsonfile) { var jsonData = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.Indented); using (var sw = new StreamWriter(jsonfile, false)) { // JSON データをファイルに書き込み sw.Write(jsonData); } //または、以下のように直接書くことのできる //File.WriteAllText(jsonfile, JsonConvert.SerializeObject(T)); } |
Newtonsoft.Json.JsonSerializerによる設定ファイルの読み込み
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using Newtonsoft.Json.JsonSerializer; public static T JsonNewtonDeSerialize<T>(string jsonfile) { using (var sr = new StreamReader(jsonfile)) { var jsonData = sr.ReadToEnd(); return JsonConvert.DeserializeObject<T>(jsonData); } //以下のように直接読み込むこともできる //return JsonConvert.DeserializeObject<T>(File.ReadAllText(jsonfile)); } |
設定ファイルのバージョンアップ
JSONを扱う3つの方法を紹介しましたが、3つとも、メンバーの追加やメンバーの順番入れ替えに柔軟に対応しています。そのため、XMLよりは使い道は広がるので、JSONを使ったほうがバージョンアップを考慮した場合は効率が良くなります。ただ、こちらも、アプリケーションの都合上、どうしてもバージョンアップが必要な場合があると思います。
バージョンアップの基本的な流れについては、「設定とパラメータファイルのバージョンアップ仕組み」を参照してください。
まとめ
XMLのSerializeより、JSONのSerializeのほうが柔軟性、速度面においてもより効率的と言えます。ですので、もし、XMLを使うならJSONを使うと効果があるので、JSONでSerializeすると良いです。(ただし、どうしても、XMLを使うべきである場合はあり得ると思いますが、それは仕方ないですね)