[英]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數組時,我得到一個匿名類型,它包含Address
和Name
而不是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
。 然后在序列化和反序列化過程中使用All
的TypeNameHandling
選項。
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.