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

尝试 JavaScriptSerializer 而不是 DataContractJsonSerializer

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

你可以试试我的 ServiceStack JsonSerializer,它是目前最快的 .NET JSON 序列化器。它支持序列化 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)中使用。尽管如此,我还是会创建一个实际类型并将其装饰为可序列化的。然后,您可以强烈键入您的网络方法。虽然这对 Javascript 来说并不重要,但它确实为该方法添加了一些自文档。任何经验丰富的程序员都能够查看函数签名并说:“哦,这是 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 回答
5

您可以使用 Newtonsoft.Json。

var warningJSON = JsonConvert.SerializeObject(new {
               warningMessage = "You have been warned..."
            });

微软在 System.Text.Json 上的新库的更快替代方案

var warningJSON = JsonSerializer.Serialize(new {
               warningMessage = "You have been warned..."
            });
于 2019-09-04T11:51:19.730 回答
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 回答