172

次のコードを使用して、匿名型を JSON にシリアル化しようとしています。

var serializer = new DataContractJsonSerializer(thing.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, thing);
var json = Encoding.Default.GetString(ms.ToArray()); 

ただし、これを実行すると次の例外が発生します。

型 '<>f__AnonymousType1`3[System.Int32,System.Int32,System.Object[]]' をシリアル化できません。これを DataContractAttribute 属性でマークし、シリアル化するすべてのメンバーを DataMemberAttribute 属性でマークすることを検討してください。サポートされているその他の型については、Microsoft .NET Framework のドキュメントを参照してください。

属性を匿名型に適用することはできません (私の知る限り)。このシリアル化を行う別の方法はありますか、それとも何か不足していますか?

4

9 に答える 9

161

DataContractJsonSerializer の代わりに JavaScriptSerializer を試す

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(your_anon_object);
于 2008-12-01T19:52:06.760 に答える
85

他の人が述べたように、Newtonsoft JSON.NETは良い選択肢です。単純な JSON シリアル化の具体的な例を次に示します。

return JsonConvert.SerializeObject(
    new
    {
       DataElement1,
       SomethingElse
    });

非常に柔軟で用途の広いライブラリであることがわかりました。

于 2012-05-09T21:56:26.510 に答える
16

現時点で最速の .NET JSONシリアライザーであるServiceStack JsonSerializerを試すことができます。DataContract、任意の POCO タイプ、インターフェイス、匿名タイプを含む遅延バインディング オブジェクトなどのシリアル化をサポートします。

基本的な例

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = customer.ToJson();
var fromJson = json.FromJson<Customer>(); 

注: Microsoft の JavaScriptSerializerは、他の JSON シリアライザーより最大 40 倍から 100 倍遅いため、ベンチマークから除外しなければならなかったため、パフォーマンスが重要でない場合にのみ使用してください。

于 2010-08-18T02:20:18.330 に答える
11

これは 2008 年のものであることに注意してください。今日は、シリアライザーを組み込む必要があり、swagger + 属性を使用してエンドポイントについて消費者に通知し、データを返すことができると主張します。


匿名型をシリアル化するべきではないと主張します。私はここでの誘惑を知っています。ブラウザのJavascriptとも呼ばれる緩い型環境で使用される使い捨て型をすばやく生成したい。それでも、実際の型を作成し、Serializable として装飾します。次に、Web メソッドを厳密に型指定できます。これは、Javascript の 1 つのイオタには関係ありませんが、メソッドにいくつかの自己文書化を追加します。ある程度の経験を積んだプログラマなら、関数のシグネチャを見て、「ああ、これは Foo 型です! JSON でどのように表示されるかはわかっています」と言うことができます。

そうは言っても、シリアル化を行うためにJSON.Netを試すことができます。うまくいくかどうかはわかりません

于 2008-12-01T19:53:57.007 に答える
11

私が見つけた最速の方法はこれでした:

var obj = new {Id = thing.Id, Name = thing.Name, Age = 30};
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(obj);

名前空間: System.Web.Script.Serialization.JavaScriptSerializer

于 2014-05-23T10:12:49.383 に答える
8

2020年頃にこれをチェックする人のために:

Microsoft の System.Text.Json 名前空間は、町の新しい王様です。パフォーマンスに関しては、私が知る限り最高です。

var model = new Model
{
    Name = "Test Name",
    Age = 5
};

string json = JsonSerializer.Serialize(model);

他の人が言及したように、NewtonSoft.Json も非常に優れたライブラリです。

于 2020-11-09T21:22:55.153 に答える
1

これを Web サービスに使用すると仮定すると、次の属性をクラスに適用できます。

[System.Web.Script.Services.ScriptService]

次に、Json を返す必要がある各メソッドに次の属性を追加します。

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

メソッドの戻り値の型を「オブジェクト」に設定します

于 2008-12-01T21:33:42.797 に答える
-2
public static class JsonSerializer
{
    public static string Serialize<T>(this T data)
    {
        try
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream();
            serializer.WriteObject(stream, data);
            string jsonData = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Length);
            stream.Close();
            return jsonData;
        }
        catch
        {
            return "";
        }
    }
    public static T Deserialize<T>(this string jsonData)
    {
        try
        {
            DataContractJsonSerializer slzr = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData));
            T data = (T)slzr.ReadObject(stream);
            stream.Close();
            return data;
        }
        catch
        {
            return default(T);
        }
    }
}
于 2011-03-28T15:20:56.170 に答える