繁体   English   中英

反序列化包含原始类型和一个类类型的object []

[英]Deserializing object[] that contains primitive types and one class type

我有一个包含字符串和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数组时,我得到一个匿名类型,它包含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; }
}

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

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

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

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

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

Args参数保留为Object 然后在序列化和反序列化过程中使用AllTypeNameHandling选项。

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对象。

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

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

得到它了。 我必须使用以下设置:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM