8

我有一个包含字符串和长整数的对象数组和这个类:

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 数组时,我得到一个匿名类型,其中包含AddressName不是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; }
}
4

3 回答 3

5

Json 不包含有关您的SimpleMailAddress类的任何继承知识。因此,当您告诉它反序列化时,您的 Args 属性是 type 的事实,Object反序列化器正在尽其所能(通过创建匿名类型)。它只看到数据,不知道你想要一个SimpleMailAddress对象。

Json.net 有一个JObject类。如果 Args 的实际内容可能会更改类型,请尝试使用它而不是 Object 作为 Args 参数。

JObject然后,根据需要,您可以从对象中读取数据。

如果您不关心 Args 的实际内容,则将其保留Object并忽略它。

编辑: JSon.Net 可以在序列化过程中嵌入类型信息,可以在反序列化过程中使用。

将您的参数保留ArgsObject. 然后在序列化和反序列化期间使用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对象。

于 2013-05-25T15:26:23.800 回答
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);
于 2013-05-26T17:33:27.767 回答
0

内置在 .net 框架中的数据联系序列化程序具有已知类型的概念,您可以在其中告诉它们预期的类型,并在反序列化期间使用这些类型。

有一个内置的 Json 数据合同序列化程序,但我不确定它是否与您的 Json 数据兼容,它可能需要通过数据合同序列化程序进行序列化和反序列化才能使用此方法工作。

于 2013-05-25T17:27:54.310 回答