如何将 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 _ _ Anonymous ousType1‘3[ System. Int32,System. Int32,System. Object []” 无法序列化。请考虑标记 它与 DataContractAttribute 一起使用 属性,并标记其所有 方法序列化的成员 DataMemberAttribute 属性,请参见 微软.NET 框架 支持的其他文件 类别。

我不能对匿名类型应用属性(据我所知)。是否有其他方法进行序列化,或者我漏掉了什么?

139223 次浏览

尝试使用 JavaScriptSerializer 代替 DataContractJsonSerializer

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

请注意这是2008年的。今天,我认为应该内置序列化器,并且可以使用 swagger + 属性通知消费者有关端点和返回数据的信息。


我认为你是 不应该序列化匿名类型。我知道这里的诱惑,你想快速生成一些抛弃类型,这些类型只会在一个松散类型的环境中使用,也就是浏览器中的 Javascript。不过,我还是会创建一个实际的类型,并将其装饰为 Serializer。然后你可以强类型你的网络方法。虽然这对 Javascript 来说一点也不重要,但是它确实给这个方法添加了一些自我文档。任何经验丰富的程序员都能够看到函数签名并说,“哦,这是 Foo 类型!我知道在 JSON 中应该是什么样子。”

尽管如此,您可以尝试 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳来进行序列化。我不知道它是否能工作

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

[System.Web.Script.Services.ScriptService]

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

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

你可以试试我的服务栈 JsonSerializer它的 最快的.NET JSON 序列化程序现在。它支持序列化数据合同、任何 POCO 类型、接口、后期绑定对象(包括匿名类型)等。

基本例子

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

注意: 只有在性能对您来说不重要的情况下才使用 MicrosoftJavaScriptSerializer,因为它到 40x-100x的速度比其他 JSON 序列化器慢,所以我不得不把它排除在我的基准测试之外。

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

正如其他人所提到的,牛顿软件 JSON.NET是一个很好的选择:

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

你可以用 Newtonsoft。

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

微软在 System.Text.Json 上的新库提供了一个更快的替代方案

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

对于那些在2020年左右查看这些信息的人:

微软的系统。短信。Json 名字空间是镇上的新国王。就表现而言,这是我所能说的最好的:

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


string json = JsonSerializer.Serialize(model);

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