サーチ…


備考

JavaScriptSerializerとJson.NET

JavaScriptSerializerクラスは.NET 3.5で導入され、AJAX対応アプリケーションの.NETの非同期通信レイヤーで内部的に使用されています。これは、マネージコードでJSONを操作するために使用できます。

JavaScriptSerializerクラスが存在するにもかかわらず、シリアル化と逆シリアル化にはオープンソースのJson.NETライブラリを使用することをお勧めします。 Json.NETはより良いパフォーマンスとカスタムクラスへのマッピングJSON(カスタムのための友好のインターフェースを提供していますJavaScriptConverterオブジェクトは 、同じ達成するために必要とされるであろうJavaScriptSerializer )。

System.Web.Script.Serialization.JavaScriptSerializerを使用した逆シリアル化

JavaScriptSerializer.Deserialize<T>(input)メソッドは、 JavaScriptSerializerによってネイティブにサポートされているデフォルトのマッピングを使用して、有効なJSONの文字列を指定された型<T>オブジェクトに逆シリアル化しようとしJavaScriptSerializer

using System.Collections;
using System.Web.Script.Serialization;

// ...

string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";

JavaScriptSerializer JSS = new JavaScriptSerializer(); 
Dictionary<string, object> parsedObj = JSS.Deserialize<Dictionary<string, object>>(rawJSON);

string name = parsedObj["Name"].toString();
ArrayList numbers = (ArrayList)parsedObj["Numbers"]

注: JavaScriptSerializerオブジェクトは.NETバージョン3.5で導入されました。

Json.NETを使用した逆シリアル化

internal class Sequence{
    public string Name;
    public List<int> Numbers;
}    

// ...

string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";

Sequence sequence = JsonConvert.DeserializeObject<Sequence>(rawJSON);

詳細については、 Json.NET公式サイトを参照してください。

注意:Json.NETは.NETバージョン2以上をサポートしています。

Json.NETを使ったシリアライゼーション

[JsonObject("person")]
public class Person
{
    [JsonProperty("name")]
    public string PersonName { get; set; }
    [JsonProperty("age")]
    public int PersonAge { get; set; }
    [JsonIgnore]
    public string Address { get; set; }
}

Person person = new Person { PersonName = "Andrius", PersonAge = 99, Address = "Some address" };
string rawJson = JsonConvert.SerializeObject(person);

Console.WriteLine(rawJson); // {"name":"Andrius","age":99}

プロパティ(およびクラス)を属性で修飾して、結果のjson文字列の外観を変更したり、json文字列(JsonIgnore)からそれらを削除する方法に注目してください。

Json.NETのシリアル化属性の詳細は、 こちらを参照してください

C#では、公開識別子はPascalCaseで慣習的に記述されています。 JSONでは、すべての名前にcamelCaseを使用します。契約リゾルバを使用して、2つの間で変換することができます。

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    [JsonIgnore]
    public string Address { get; set; }
}

public void ToJson() {
    Person person = new Person { Name = "Andrius", Age = 99, Address = "Some address" };
    var resolver = new CamelCasePropertyNamesContractResolver();
    var settings = new JsonSerializerSettings { ContractResolver = resolver };
    string json = JsonConvert.SerializeObject(person, settings);

    Console.WriteLine(json); // {"name":"Andrius","age":99}
}

シリアライゼーション - Newtonsoft.Jsonを使用した逆シリアル化

他のヘルパーとは異なり、このクラスは静的クラスヘルパーを使用してシリアライズおよびデシリアライズします。したがって、使用するヘルパーよりも少し簡単です。

using Newtonsoft.Json;

var rawJSON      = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
var fibo         = JsonConvert.DeserializeObject<Dictionary<string, object>>(rawJSON);
var rawJSON2     = JsonConvert.SerializeObject(fibo);

動的バインディング

NewtonsoftのJson.NETでは、型を明示的に作成する必要なく、動的に(ExpandoObject / Dynamicオブジェクトを使用して)jsonを動的にバインドできます。

シリアライゼーション

dynamic jsonObject = new ExpandoObject();
jsonObject.Title   = "Merchent of Venice";
jsonObject.Author  = "William Shakespeare";
Console.WriteLine(JsonConvert.SerializeObject(jsonObject));

デシリアライゼーション

var rawJson = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
dynamic parsedJson = JObject.Parse(rawJson);
Console.WriteLine("Name: " + parsedJson.Name);
Console.WriteLine("Name: " + parsedJson.Numbers.Length);

rawJsonオブジェクトのキーが動的オブジェクトのメンバー変数に変換されていることに注目してください。

これは、アプリケーションが様々な形式のJSONを受け入れ/生成できる場合に便利です。ただし、Jsonストリングまたはシリアライゼーション/デシリアライゼーションの結果として生成された動的オブジェクトに対して、追加レベルの検証を使用することをお勧めします。

JsonSerializerSettingsでのJson.NETを使用したシリアル化

このシリアライザには、デフォルトの.net jsonシリアライザにはないNull値処理のような優れた機能がありますJsonSerializerSettingsを作成するだけです。

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
   return result;
}

.netの別の深刻なシリアライザの問題は、自己参照ループです。コースに登録されている学生の場合、インスタンスにはコースプロパティがあり、コースには参照ループを作成するList<Student>を意味する学生のコレクションがあります。これはJsonSerializerSettings処理できます:

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
   return result;
}

次のようなさまざまなシリアライズオプションを設定できます:

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
   return result;
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow