【问题标题】:Deserializing object[] that contains primitive types and one class type反序列化包含原始类型和一种类类型的 object[]
【发布时间】:2013-05-25 04:34:47
【问题描述】:

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

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

【问题讨论】:

  • 你能贴出显示你如何序列化和反序列化的代码
  • @cheedep - 当然,已添加。
  • 您还可以添加 Json 的示例吗?我认为你的问题有点不清楚。你到底想达到什么目的?你想反序列化成匿名对象还是SimpleMailAddress

标签: c# json serialization json.net


【解决方案1】:

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

【讨论】:

  • 我也尝试过使用 JsonConvert.SerializeObject(body, Formatting.None, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }) 进行反序列化,它指定了类型,但它仍然将其反序列化为 JObject
  • 啊,亲爱的,干得好。我和你一样想通了;)我实际上不确定我是否需要我包含的TypeNameAssemblyFormat
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    知道了。我必须使用这些设置:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      相关资源
      最近更新 更多