👨‍💻

C# - JSON - JavaScriptSerializer 利用方法

2025/01/03に公開

はじめに

WEB API クライアントアプリ作成時などで JSON を扱います。
C# での JSON シリアライザとしては、下記などがあります。

  • System.Text.Json
    • .NET Core 3.0以降(.NET5 以降も含む)で提供され、2021年からは System.Text.Json が推奨となっています。
    • .NET Framework(4.6.1以降)の場合は NuGet Gallery | System.Text.Json から取得することで利用可能です。
  • Json.NET
    • サードパーティ製ライブラリで NuGet Gallery | Newtonsoft.Json から取得できます。
    • 多機能で使い勝手が良いので、長い間、デファクトスタンダードとして利用されてきましたが、Microsoft が System.Text.Json を提供し、強烈にプッシュしているので、今後 System.Text.Json への書き換えが進むのでしょうか、、、
  • System.Web.Script.Serialization.JavaScriptSerializer
    • .NET Framework 3.5 で、ASP.NET - AJAX 対応アプリでの JSON シリアライザとして提供されました。
    • 上記目的で提供されていますが、.NET Framework デスクトップアプリでも利用可能です。
    • .NET Core 3.0以降(.NET5 以降も含む)では、利用不可です。
  • System.Runtime.Serialization.Json.DataContractJsonSerializer
    • .NET Framework 当初から提供されています。
  • Dynamic.Json

.NET Framework 3.5 で動作するアプリを作成していたこともあり、サイドバイサイドにライブラリ配置が不要で、C# 標準 XMLシリアライザと同等の使い勝手で利用できる、 JavaScriptSerializer のお世話になることが多かったです。
今回は、JavaScriptSerializer 利用方法について記載しておこうと思います。

テスト環境

ここに記載した情報/ソースコードは、Visual Studio Community 2022 を利用した下記プロジェクトで生成したモジュールを Windows 11 24H2 で動作確認しています。

  • Windows Forms - .NET Framework 4.8
  • WPF - .NET Framework 4.8

JavaScriptSerializer

https://learn.microsoft.com/ja-jp/dotnet/api/system.web.script.serialization.javascriptserializer

参照設定

JavaScriptSerializer クラスを利用する場合、System.Web.Extensions.dll の参照追加が必要です。

using System.Web.Script.Serialization;

Serialize

Serialize で、オブジェクトを JSON 文字列に 変換します。

Person obj = new Person();
obj.PersonID = 1234;
obj.Name = "hoge";
obj.Registered = true;

// シリアライズ
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(obj);
public class Person
{
  public int PersonID { get; set; }
  public string Name { get; set; }
  public bool Registered { get; set; }
}

Deserialize

Deserialize で、指定した JSON 文字列を指定した型 T のオブジェクトに変換します。

StringBuilder sb = new StringBuilder();
sb.Append("{\"PersonID\":1234,");
sb.Append("\"Name\":\"Hoge\",");
sb.Append("\"Registered\":true}");

// デシリアライズ
JavaScriptSerializer serializer = new JavaScriptSerializer();
Person obj = serializer.Deserialize<Person>(sb.ToString());
public class Person
{
  public int PersonID { get; set; }
  public string Name { get; set; }
  public bool Registered { get; set; }
}

MaxJsonLength

JavaScriptSerializer クラスで受け入れ可能な JSON 文字列の最大長は MaxJsonLength プロパティで参照/設定可能で、既定値は 2,097,152 文字となっています。

シリアライズで出力が MaxJsonLength を超えた場合は InvalidOperationException の例外が発生します。
デシリアライズで入力が MaxJsonLength を超えている場合は ArgumentException の例外が発生します。

デシリアライズについては、事前にJSONサイズを確認すれば、MaxJsonLength についての例外は抑止できます。

シリアライズについては、前述例外時に、必要なサイズを変数なりで受け取れると、自然にリトライ処理につなぐことができたりするんですけど、、、
まぁ、対象オブジェクトの概算サイズを事前に確認とか、JSON の受け渡し相手 - WEB API 側などでも送受信サイズの最大値などを決めるので、それにあわせて MaxJsonLength を設定とかになります。

このため、下記のようにラップして利用することもありました。

// オブジェクトをJSON文字列に変換する
private string JsonSerialize(object obj, int maxJsonLength = 0)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    if (maxJsonLength > serializer.MaxJsonLength)
    {
        serializer.MaxJsonLength = maxJsonLength;
    }
    return serializer.Serialize(obj);
}
// JSON文字列をオブジェクトに変換する
private T JsonDeserialize<T>(string json, int maxJsonLength = 0)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    // JSONサイズが確認できるので確認
    maxJsonLength = maxJsonLength > json.Length ?
        maxJsonLength : json.Length;
    if (maxJsonLength > serializer.MaxJsonLength)
    {
        serializer.MaxJsonLength = maxJsonLength;
    }
    return serializer.Deserialize<T>(json);
}

出典

本記事は、2025/01/03 Qiita 投稿記事の転載です。

C# - JSON - JavaScriptSerializer 利用方法

Discussion