如何将C#匿名types序列化为JSONstring?

我试图使用下面的代码来将一个匿名types序列化为JSON:

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

但是,当执行此操作时,我会得到以下exception:

types'<> f__AnonymousType1`3 [System.Int32,System.Int32,System.Object []]'不能被序列化。 考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记要序列化的所有成员。 有关其他支持的types,请参阅Microsoft .NET Framework文档。

我不能将属性应用于匿名types(据我所知)。 有没有另外一种方法来做这个序列化或者我错过了什么?

尝试JavaScriptSerializer而不是DataContractJsonSerializer

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

正如其他人所提到的, Newtonsoft JSON.NET是一个不错的select。 这里是一个简单的JSON序列化的具体例子:

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

我发现它是一个非常灵活,多function的图书馆。

您可以尝试我的ServiceStack JsonSerializer这是目前最快的.NET JSON序列化器 。 它支持序列化DataContract,任何POCOtypes,接口,包括匿名types等的后期绑定对象。

基本例子

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

注意:如果性能对你并不重要,那么只能使用微软的JavaScriptSerializer,因为我不得不将它从基准testing中解脱出来,因​​为它比其他JSON序列化器慢了40倍100倍

我会争辩说,你不应该序列化一个匿名types 。 我知道这里的诱惑; 你想要快速生成一些抛弃types,这些types只是在浏览器中的一个松散types的环境JavaScript中使用。 不过,我会创build一个实际的types,并将其作为Serializable装饰。 然后,您可以强烈键入您的networking方法。 虽然这不关心Javascript的一个iota,它确实增加了一些自我文档的方法。 任何经验丰富的程序员都可以看看函数签名,然后说:“哦,这是Footypes的!我知道JSON应该怎么样。”

话虽如此,你可以试试JSON.Net来做序列化。 我不知道这是否会奏效

我发现的最快的方法是这样的:

 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

假设您正在使用这个Web服务,您可以将以下属性应用于该类:

 [System.Web.Script.Services.ScriptService] 

然后下面的属性给每个应该返回Json的方法:

 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

并将方法的返回types设置为“对象”

 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); } } }