反序列化包含基本类型和一个类类型的对象数组

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

1
你能否发布展示如何序列化和反序列化的代码? - cheedep
你能否添加一个Json的示例?我认为你的问题有点不清楚。你到底想要实现什么?你想反序列化成匿名对象还是SimpleMailAddress - Shulhi Sapli
3个回答

5
Json本身不包含任何关于你的SimpleMailAddress类的继承知识。因此,当你告诉它进行反序列化时,由于Args属性是Object类型,反序列化程序会尽力而为(创建一个匿名类型)。它只看到数据,根本不知道你想要一个SimpleMailAddress对象。
Json.net有一个JObject类。如果Args参数的实际内容可能会更改,请尝试使用它来代替Object。
然后,按需从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
我已经尝试过使用以下代码进行反序列化:JsonConvert.SerializeObject(body, Formatting.None, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }),该代码指定了类型,但仍将其反序列化为 JObject - Caleb Jares
啊,太好了,干得漂亮。我和你一样也想到了这个 ;) 不过,我其实不确定我是否需要包含 TypeNameAssemblyFormat - Caleb Jares

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

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接