LoginSignup
9
10

More than 5 years have passed since last update.

Jsonのシリアライズ、デシリアライズ

Last updated at Posted at 2015-11-20

はじめに

いまさらながらJsonを使うことになり、標準のJsonで使い方を調べエクステンションを使ったサンプルを作成した。

サンプルコード

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;

namespace JsonSample
{
    [DataContract]
    public class FriendInfo
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Address { get; set; }
        [DataMember]
        public int Age { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var friends = new FriendInfo[]{
                new FriendInfo()
                {
                    Name = "Name1",
                    Address = "Hokkaido 1",
                    Age = 12
                },
                new FriendInfo()
                {
                    Name = "Name2",
                    Address = "Hokkaido 2",
                    Age = 13
                },
            };

            // シリアライズ
            var json = friends.ToJson();
            Console.WriteLine(json);
            // デシリアライズ
            // 無駄なオブジェクトが発生する拡張メソッドの例
            var defrie = new List<FriendInfo>().FromJson(json);

            // chocolamintさんの指摘を参考にstringのエクステンションに
            foreach (var info in json.DeserializingJson<List<FriendInfo>>())
                Console.WriteLine("Name:{0} Adress:{1} Age:{2}", info.Name, info.Address, info.Age);

            Console.ReadLine();
        }
    }
}

ClassExtention.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace JsonSample
{
    public static class ClassExtension
    {
        public static string ToJson<T>(this T obj) where T : class
        {
            var serializer = new DataContractJsonSerializer(typeof(T));

            using (var stream = new MemoryStream())
            {
                serializer.WriteObject(stream, obj);
                return Encoding.UTF8.GetString(stream.ToArray());
            }

        }

        public static T FromJson<T>(this T obj, string json) where T : class
        {
            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                return serializer.ReadObject(stream) as T;
            }
        }
    }
}

StringExtention.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace JsonSample
{
    public static class StringExtension
    {
        public static T DeserializingJson<T>(this string obj)
        {
            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)))
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                return (T)serializer.ReadObject(stream);
            }
        }
    }
}

9
10
2

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
9
10