Json.NETを利用したシリアライズとデシリアライズのやり方をまとめます。JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つです。様々な言語で扱えるデータ形式で、データの受け渡しに頻繁に利用されています。
【検証環境】.NET Framework 4.7.2
パッケージのインストール
PM> Install-Package Newtonsoft.Json
https://www.newtonsoft.com/json
クラスの定義
サンプルコードで使うPersonクラスを定義します。
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Person
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("age")]
public int Age { get; set; }
[JsonProperty("height")]
public int Height { get; set; }
public static Person GetPerson()
{
return new Person()
{
Name = "本田翼",
Age = 28,
Height = 166,
};
}
public static List<Person> GetPepople()
{
return new List<Person>()
{
new Person()
{
Name = "永野芽郁",
Age = 21,
Height = 163,
},
new Person()
{
Name = "本田翼",
Age = 28,
Height = 166,
},
new Person()
{
Name = "戸田恵梨香",
Age = 32,
Height = 164,
},
};
}
}
使い方
オブジェクトの シリアライズ/デシリアライズ
//シリアライズ
var jsonString = JsonConvert.SerializeObject(Person.GetPerson());
Console.WriteLine(jsonString);
//{"height":166,"age":28,"name":"本田翼"}
//※第2引数にFormatting.Indentedを指定すると、インデントを整形して出力する
jsonString = JsonConvert.SerializeObject(Person.GetPerson(), Formatting.Indented);
Console.WriteLine(jsonString);
//{
// "height": 166,
// "age": 28,
// "name": "本田翼"
//}
//デシリアライズ
var person = JsonConvert.DeserializeObject<Person>(jsonString);
コレクションの シリアライズ/デシリアライズ
//シリアライズ
var jsonString = JsonConvert.SerializeObject(Person.GetPepople(), Formatting.Indented);
Console.WriteLine(jsonString);
//[
// {
// "name": "永野芽郁",
// "age": 21,
// "height": 163
// },
// {
// "name": "本田翼",
// "age": 28,
// "height": 166
// },
// {
// "name": "戸田恵梨香",
// "age": 32,
// "height": 164
// }
//]
//デシリアライズ
var people = JsonConvert.DeserializeObject<List<Person>>(jsonString);
ディクショナリの シリアライズ/デシリアライズ
//シリアライズ
var dic1 = Person.GetPepople().Where(p => p.Age < 30).ToDictionary(p => p.Name);
var jsonString = JsonConvert.SerializeObject(dic1, Formatting.Indented);
Console.WriteLine(jsonString);
//{
// "永野芽郁": {
// "name": "永野芽郁",
// "age": 21,
// "height": 163
// },
// "本田翼": {
// "name": "本田翼",
// "age": 28,
// "height": 166
// }
//}
//デシリアライズ
var dic2 = JsonConvert.DeserializeObject<Dictionary<string, Person>>(jsonString);
シリアライズしたデータをjsonファイルに出力
File.WriteAllText(@"D:CSharptest.json", JsonConvert.SerializeObject(Person.GetPepople(), Formatting.Indented));
もしくは
using (var writer = new StreamWriter(@"D:CSharptest.json"))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(writer, dic);
//下記でもいける
//writer.WriteLine(JsonConvert.SerializeObject(dic, Formatting.Indented));
}
jsonファイルのデータを読み込んでデシリアライズ
var dic = Person.GetPepople().ToDictionary(p => p.Name);
var dic = JsonConvert.DeserializeObject<Dictionary<string, Person>>(File.ReadAllText(@"D:CSharptest.json"));
もしくは
using (var reader = new StreamReader(@"D:CSharptest.json"))
{
JsonSerializer serializer = new JsonSerializer();
var dic = (Dictionary<string, Person>)serializer.Deserialize(reader, typeof(Dictionary<string, Person>));
}