.NET Framework(NuGetパッケージなし)でJsonを扱う方法

この記事は公開から3年以上経過しています。

プロジェクト規約によりNugetパッケージが使えないときなどに、.NET FrameworkのみでJsonのシリアライズ↔デシリアライズ(Json↔DTOクラスの相互変換)を行う方法。

サンプルソースコード

C#

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;

namespace JsonObjConvertCS
{
    static class Program
    {
        static void Main(string[] args)
        {
            var data = new DTO
            {
                Id = 1,
                Name = "item1",
                Items = new[]
                {
                    new NestedDTO { value = "val1" },
                    new NestedDTO { value = "val2" }
                }
            };
            // object→JSON変換
            var jsonData = data.ToJson();
            // JSON→object変換
            var classData = jsonData.FromJson<DTO>();
        }

        // object→JSON変換
        public static string ToJson<T>(this T source)
        {
            try
            {
                var js =  new DataContractJsonSerializer(typeof(T));
                using(var ms = new MemoryStream())
                {
                    js.WriteObject(ms, source);
                    return Encoding.UTF8.GetString(ms.ToArray());
                }
            }
            catch
            {
                return string.Empty;
            }
        }

        // JSON→object変換
        public static T FromJson<T>(this string source)
        {
            try
            {
                var js = new DataContractJsonSerializer(typeof(T));
                using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(source), false))
                {
                    return (T)js.ReadObject(ms);
                }
            }
            catch
            {
                return default(T);
            }
        }
    }

    // DTOクラス
    [DataContract]
    sealed class DTO
    {
        [DataMember]
        public int Id { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public NestedDTO[] Items { get; set; }
    }

    // DTO構造体(ネスト)
    [DataContract]
    struct NestedDTO
    {
        [DataMember]
        public string value { get; set; }
    }
}

VB.NET

Imports System.IO
Imports System.Runtime.CompilerServices
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Json
Imports System.Text

Module Module1

    Sub Main()
        Dim data As DTO = New DTO With
            {
                .Id = 1,
                .Name = "item1",
                .Items =
                {
                    New NestedDTO With {.Value = "val1"},
                    New NestedDTO With {.Value = "val2"}
                }
            }
        ' Object→JSON変換
        Dim jsonData = data.ToJson()
        ' JSON→Object変換
        Dim classData = jsonData.FromJson(Of DTO)()
    End Sub

   ' Object→JSON変換
    <Extension()>
    Public Function ToJson(Of T)(source As T) As String
        Try
            Dim js As DataContractJsonSerializer = New DataContractJsonSerializer(GetType(T))
            Using ms As MemoryStream = New MemoryStream()
                js.WriteObject(ms, source)
                Return Encoding.UTF8.GetString(ms.ToArray())
            End Using
        Catch ex As Exception
            Return String.Empty
        End Try
    End Function

    ' JSON→Object変換
    <Extension()>
    Public Function FromJson(Of T)(source As String) As T
        Try
            Dim js As DataContractJsonSerializer = New DataContractJsonSerializer(GetType(T))
            Using ms As MemoryStream = New MemoryStream(Encoding.UTF8.GetBytes(source), False)
                Return CType(js.ReadObject(ms), T)
            End Using
        Catch ex As Exception
            ' VB.NETのdefault(T)相当
            Return CType(Nothing, T)
        End Try
    End Function

    ' DTOクラス
    <DataContract()>
    Class DTO

        <DataMember()>
        Public Property Id As Integer

        <DataMember()>
        Public Property Name As String

        <DataMember()>
        Public Property Items As NestedDTO()

    End Class

    ' DTO構造体(ネスト)
    <DataContract()>
    Structure NestedDTO

        <DataMember()>
        Public Property Value As String

    End Structure

End Module

実行結果

C#

file

VB.NET

file

いずれもobject↔JSONの変換ができていることが確認できます。

参考ウェブサイトなど

Microsoft Docs
DataContractJsonSerializer を使用する方法

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする