我有一个包含字符串和long的对象数组,以及这个类:
public class SimpleMailAddress
{
public string Address { get; set; }
public string Name { get; set; }
public static implicit operator MailAddress(SimpleMailAddress m)
{
return new MailAddress(m.Address, m.Name);
}
}
但是,当使用Json.Net反序列化JSON数组时,我得到一个包含Address
和Name
而不是SimpleMailAddress
对象的匿名类型。
我不想创建一个强类型对象来反序列化,因为它不会被重用,我必须为它创建很多对象。有没有办法用Json.Net或任何其他库来做到这一点?
这就是我序列化/反序列化的方式:
var json = JsonConvert.SerializeObject(myObject);
var myObject = JsonConvert.DeserializeObject<MailMessageRequest>(json);
MailMessageRequest
:
public class MailMessageRequest
{
public string Mailer { get; set; }
public string Method { get; set; }
public object[] Args { get; set; }
}
答案 0 :(得分:4)
Json不包含有关您的SimpleMailAddress
课程的任何继承知识。因此,当您告诉它反序列化时,事实上您的Args属性类型为Object
,反序列化程序正在尽其所能(通过创建匿名类型)。它只是看到数据,它不知道你想要一个SimpleMailAddress
对象。
Json.net有一个JObject
课程。如果Args的实际内容可能会改变类型,请尝试使用它而不是Object作为Args参数。
然后,根据需要,您可以从JObject
对象中读取数据。
如果您不关心Args的实际内容,请将其保留为Object
并忽略它。
编辑:JSon.Net可以在序列化期间嵌入类型信息,可以在反序列化期间使用。
将Args
参数保留为Object
。然后在序列化和反序列化期间使用TypeNameHandling
All
选项。
var json = JsonConvert.SerializeObject(myObject, Formatting.None,
new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All });
var myObject = JsonConvert.DeserializeObject<MailMessageRequest>(json,
new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All });
您最终应将Args
对象作为所需的SimpleMailAddress
对象。
答案 1 :(得分:0)
.NET框架中内置的数据联系人序列化程序具有已知类型的概念,您可以告诉它们期望的类型,并在反序列化期间使用它们。
有一个内置的Json数据协定序列化程序,但我不确定它是否与您的Json数据兼容,它可能需要通过datacontract序列化程序进行序列化和反序列化才能使用此方法。
答案 2 :(得分:0)
知道了。我必须使用这些设置:
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Full
};
var json = JsonConvert.SerializeObject(object, Formatting.None, settings);
var object = JsonConvert.DeserializeObject<MailMessageRequest>(message.Body, settings);