C#

【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:\CSharp\test.json", JsonConvert.SerializeObject(Person.GetPepople(), Formatting.Indented));


もしくは

using (var writer = new StreamWriter(@"D:\CSharp\test.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:\CSharp\test.json"));


もしくは

using (var reader = new StreamReader(@"D:\CSharp\test.json"))
{ 
    JsonSerializer serializer = new JsonSerializer();
    var dic = (Dictionary<string, Person>)serializer.Deserialize(reader, typeof(Dictionary<string, Person>));
}

エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい