如何将C#匿名类型序列化为JSON字符串?

时间:2008-12-01 19:48:33

标签: c# json anonymous-types datacontractjsonserializer json-serialization

我正在尝试使用以下代码将匿名类型序列化为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   其他支持的文档   类型。

我无法将属性应用于匿名类型(据我所知)。有没有其他方法来进行此序列化或我错过了什么?

9 个答案:

答案 0 :(得分:154)

尝试使用JavaScriptSerializer而不是DataContractJsonSerializer

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

答案 1 :(得分:66)

正如其他人所说,Newtonsoft JSON.NET是一个不错的选择。以下是简单JSON序列化的具体示例:

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

我发现它是一个非常灵活,多功能的库。

答案 2 :(得分:13)

您现在可以尝试我的ServiceStack JsonSerializer fastest .NET JSON serializer。它支持序列化DataContract,任何POCO类型,接口,包含匿名类型的后期绑定对象等。

基本示例

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

注意:如果性能对您不重要,请仅使用Microsofts JavaScriptSerializer,因为我不得不将其从基准测试中删除,因为它比其他JSON序列化器慢了 40x-100x 。 / p>

答案 3 :(得分:11)

请注意这是从2008年开始的。今天我认为应该内置序列化程序,并且您可以使用swagger +属性来告知消费者您的端点和返回数据。


我认为你不应该序列化匿名类型。我知道这里的诱惑;你想快速生成一些丢弃类型,这些类型只是在松散类型的环境中使用,也就是浏览器中的Javascript。不过,我会创建一个实际类型并将其装饰为Serializable。然后,您可以强烈键入您的Web方法。虽然这与Javascript的iota无关,但它确实为该方法添加了一些自我文档。任何经验丰富的程序员都可以查看函数签名并说:“哦,这是类型Foo!我知道JSON应该怎么样。”

话虽如此,您可以尝试 JSON.Net 进行序列化。我不知道它是否会起作用

答案 4 :(得分:8)

我找到的最快的方法是:

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

答案 5 :(得分:2)

您可以使用Newtonsoft.Json。

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

答案 6 :(得分:1)

假设您将此用于Web服务,您只需将以下属性应用于该类:

[System.Web.Script.Services.ScriptService]

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

并将方法的返回类型设置为“object”

答案 7 :(得分:0)

对于那些在2020年左右进行检查的人:

Microsoft的System.Text.Json命名空间是该镇的新国王。就性能而言,据我所知,这是最好的:

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

string json = JsonSerializer.Serialize(model);

就像其他人提到的那样,NewtonSoft.Json也是一个非常不错的库。

答案 8 :(得分:-1)

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