我正在尝试使用以下代码将匿名类型序列化为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 其他支持的文档 类型。
我无法将属性应用于匿名类型(据我所知)。有没有其他方法来进行此序列化或我错过了什么?
答案 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);
}
}
}