web-dev-qa-db-ja.com

C#匿名型をJSON文字列にシリアル化するにはどうすればよいですか?

次のコードを使用して、匿名型を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のドキュメントを参照してください。

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

156
JC Grubbs

DataContractJsonSerializerの代わりにJavaScriptSerializerを試してください

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(your_anon_object);
155
Nick Berardi

他の人が言及したように、 Newtonsoft JSON.NET は良いオプションです。次に、簡単なJSONシリアル化の具体例を示します。

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

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

69
Matthew Nichols

ServiceStackを試すことができます JsonSerializer 現時点では 最速の.NET JSONシリアライザー です。 DataContract、Any POCO Type、Interfaces、匿名型を含むレイトバウンドオブジェクトなどのシリアル化をサポートします。

基本的な例

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

注:パフォーマンスが重要でない場合のみ、Microsofts JavaScriptSerializerを使用してください。最大40x-100xなので、ベンチマークから除外する必要がありました。他のJSONシリアライザーよりも低速です。

13
mythz

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


あなたは匿名型をシリアライズすべきではないと主張します。私はここで誘惑を知っています。緩い型の環境、つまりブラウザーのJavascriptで使用されるスローアウェイ型を迅速に生成する必要があります。それでも、実際の型を作成し、Serializableとして装飾します。その後、Webメソッドを強く入力できます。これはJavascriptの1つのiotaには関係ありませんが、メソッドに自己文書化を追加します。経験豊富なプログラマなら誰でも、関数のシグネチャを見て、「ああ、これはFoo型です。JSONでどのように見えるか知っています」と言うことができます。

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

11
Jason Jackson

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

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

8
i31nGo

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

[System.Web.Script.Services.ScriptService]

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

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

1
Paul