簡體   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