【C#】Json.NETの使い方

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>));
}

Leave a Reply

Your email address will not be published. Required fields are marked *