反序列化对象[],它包含基本类型和一个类类型

本文关键字:类型 一个 对象 包含基 反序列化 | 更新日期: 2023-09-27 18:15:22

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

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反序列化JSON数组时。Net,我得到一个包含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数据兼容,它可能需要通过数据契约序列化器进行序列化和反序列化才能使用这个方法。

明白了。我必须使用这些设置:

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);
相关文章: