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

如何将C#匿名类型序列化为JSON字符串?,c#,json,anonymous-types,datacontractjsonserializer,json-serialization,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__AnonymousType

我试图使用以下代码将匿名类型序列化为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[] 无法序列化。考虑标记 它使用datacontract属性 属性,并标记其所有 要使用序列化的成员 DataMemberAttribute属性。看见 Microsoft.NET框架 其他受支持项目的文档 类型


我无法将属性应用于匿名类型(据我所知)。是否有其他方法来实现序列化,或者我遗漏了什么

尝试JavaScriptSerializer而不是DataContractJsonSerializer

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(your_anon_object);
请注意这是2008年的。今天,我认为序列化程序应该内置,并且您可能可以使用swagger+属性来通知消费者您的端点和返回数据


我认为你不应该序列化匿名类型。我知道这里的诱惑;您希望快速生成一些一次性类型,这些类型将在浏览器中的松散类型环境(又称Javascript)中使用。尽管如此,我还是会创建一个实际的类型,并将其装饰为可序列化的。然后,您可以强键入web方法。虽然这对Javascript一点都不重要,但它确实为该方法添加了一些自我文档。任何有经验的程序员都可以看到函数签名并说:“哦,这是Foo类型!我知道在JSON中应该是什么样子。”


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

假设您将其用于web服务,您可以将以下属性应用于该类:

[System.Web.Script.Services.ScriptService]
然后为每个应返回Json的方法添加以下属性:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

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

您可以尝试我的ServiceStack,这是目前最流行的方法。它支持序列化DataContract、任何POCO类型、接口、后期绑定对象(包括匿名类型)等

基本示例

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = customer.ToJson();
var fromJson = json.FromJson<Customer>(); 
var客户=新客户{Name=“Joe Bloggs”,年龄=31};
var json=customer.ToJson();
var fromJson=json.fromJson();
注意:只有在性能对您不重要的情况下才使用Microsofts JavaScriptSerializer,因为它比其他JSON序列化程序慢40x-100x。

公共静态类JsonSerializer
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);
        }
    }
}
{ 公共静态字符串序列化(此为T数据) { 尝试 { DataContractJsonSerializer serializer=新的DataContractJsonSerializer(typeof(T)); var stream=newmemoryStream(); serializer.WriteObject(流、数据); string jsonData=Encoding.UTF8.GetString(stream.ToArray(),0,(int)stream.Length); stream.Close(); 返回jsonData; } 抓住 { 返回“”; } } 公共静态T反序列化(此字符串为jsonData) { 尝试 { DataContractJsonSerializer slzr=新的DataContractJsonSerializer(类型(T)); var stream=newmemoryStream(Encoding.UTF8.GetBytes(jsonData)); T data=(T)slzr.ReadObject(流); stream.Close(); 返回数据; } 抓住 { 返回默认值(T); } } }
正如其他人所提到的,这是一个很好的选择。下面是一个简单JSON序列化的具体示例:

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

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

我找到的最快方法是:

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

您可以使用Newtonsoft.Json

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(your_anon_object);
var warningJSON = JsonConvert.SerializeObject(new {
                warningMessage = "You have been warned..."
            });

对于那些在2020年左右检查这一点的人:

微软的System.Text.Json名称空间是新的王者。就性能而言,我认为这是最好的:

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

string json = JsonSerializer.Serialize(model);

正如其他一些人所提到的,NewtonSoft.Json也是一个非常好的库。

Json.Net工作正常。我认为你不应该:),我认为这在很多情况下都是合理的。在看到MVC中使用的“一次性”类型后,我可以看到一些引人注目的用途。我认为它是一个非常方便的工具,可以放在你的.Net工具箱中。这一点我也软化了,特别是对于仅限消费的类型。但是如果对象返回到服务器,或者在多个位置使用,我仍然相信创建一个类型会导致更少的问题。DataContract样式的反序列化不能很好地处理多态类型。您必须编写自己的反序列化程序。太多的代码维护。序列化匿名类型很有用的一个用例是web API的单元测试。Trackback,它似乎在SP1中不再被弃用。对于一些如此陈旧的东西,它似乎正在许多新的Microsoft框架中使用,包括MVC。如何将其包含在非asp.net项目(控制台应用程序)中?@Alxandr:您需要引用
System.Web.Extensions.dll
,并使用System.Web.Script.Serialization添加
语句。@randomgui问题是项目输出类型设置为client-profile。对于标准ASP web服务,方法上不需要[ScriptMethod(ResponseFormat=ResponseFormat.Json)],只需[WebMethod]即可。另外,您不应该将返回类型设置为object,它可以而且应该是非复杂(即可以序列化)类型的强类型。我正在使用MVC3堆栈上的MS JavaScriptSerializer来序列化具有少量数据的对象。在这种情况下速度非常快,只需要不到一毫秒的时间就可以完成我需要的任务。DB查询本身需要花费50x-100x的时间,所以在我的情况下,这并不是一个很大的瓶颈。。。你知道,“最快的.NETJSON序列化程序”链接是404ing!另外,这个答案已经超过5岁半了。D