この記事は公開から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#
VB.NET
いずれもobject↔JSONの変換ができていることが確認できます。
参考ウェブサイトなど
Microsoft Docs
DataContractJsonSerializer を使用する方法
以上です。