LoginSignup
2
6

More than 5 years have passed since last update.

[C#][.NET][JSON] オブジェクトのシリアライズ/デシリアライズ(Json.NETの使用方法)

Posted at

先日書いた以下の記事をJSONを使ったものでも実装してみた。

[C#][.NET][XML] オブジェクトのシリアライズ/デシリアライズ(DataContractSerializerの使用方法) - Qiita

Jsonでのメリットとしては変数の定義順に左右されなくなるとのこと。処理速度の差については未確認。
標準の DataContractJsonSerializer もあるらしいが、今回は Json.NET(MIT License) を利用してみた。

Json.NET - Newtonsoft

事前準備

Nugetでパッケージをインストール。
NuGet Gallery | Json.NET 9.0.1

Install-Package Newtonsoft.Json

usingの設定

using Newtonsoft.Json;

使用方法

実装は XMLで実装したもの の使いまわし。

サンプル実装
using Newtonsoft.Json;
using System.Diagnostics;
using System.IO;
using System.Text;

namespace ConsoleApplication1
{
    public class Fuga
    {
        public string ClassText;
    }

    public class Hoge
    {
        public string Text;

        [JsonIgnore]
        public string IgnoreText;

        public Fuga fuga { get; set; } = new Fuga();
    }

    public class JSONSerializer<Type>
    {
        private string fileName;

        public JSONSerializer(string fileName)
        {
            this.fileName = fileName;
        }

        public void Write(Type obj)
        {
            var json = JsonConvert.SerializeObject(obj, Formatting.Indented);

            using (var sw = new StreamWriter(fileName, false, Encoding.UTF8))
            {
                sw.Write(json);
            }
        }

        public Type Read()
        {
            using (var sr = new StreamReader(fileName, Encoding.UTF8))
            {
                var data =  sr.ReadToEnd();
                return JsonConvert.DeserializeObject<Type>(data);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string fileName = @"test.json";

            var obj = new Hoge();
            obj.Text = "hogetext";
            obj.IgnoreText = "ignoretext";
            obj.fuga.ClassText = "fugatext";

            var serializer = new JSONSerializer<Hoge>(fileName);

            serializer.Write(obj);

            Hoge readobj = serializer.Read();

            Debug.WriteLine($"{nameof(readobj.Text)} : {readobj.Text}");
            Debug.WriteLine($"{nameof(readobj.IgnoreText)} : {readobj.IgnoreText}");
            Debug.WriteLine($"{nameof(readobj.fuga.ClassText)} : {readobj.fuga.ClassText}");
        }
    }
}
json出力
{
  "Text": "hogetext",
  "fuga": {
    "ClassText": "fugatext"
  }
}
デバッグ出力
Text : hogetext
IgnoreText : 
ClassText : fugatext

除外以外には特に指定もいらず簡単に実装できた。

特記事項としては以下になる。

  • シリアライズ時の除外指定には [JsonIgnore] の属性を使用する

上記の通り使用方法がシンプルなのと、公式のドキュメントがわりと整備されているため実装には特に困らないと思われる。

参考

Serialize an Object
Deserialize an Object
C# Json.NET 入門1:JsonConvert - BEACHSIDE BLOG

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6