[英]How to fake the type in JSON.NET when serializing out?
讓我說我有
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
}
現在,如果我創建一個匿名類型,如...
var p = new Person() {FirstName = "bob",
LastName = "builder",
PhoneNumber = "0800 YESWECAN"};
var anon = new {p.FirstName, p.LastName};
使用JSON.NET,當你有TypeNameHandling = TypeNameHandling.Objects時,它將序列化(然后用於deserilization)類型。 我想要做的是偽造類中的類型,以便當它被序列化時,它看起來像一個“人”對象。
有一個很好的簡單方法嗎?
注意:它必須在json($ type)中有Json.Net類型信息。 所以LBs的答案並沒有解決問題,事實上我只能使用.net框架的json工具來做到這一點。
您可以序列化為
string str = JsonConvert.SerializeObject(new { FirstName = "aaa", LastName = "bbb" })
你會得到一個看起來像Person對象的字符串
{"FirstName":"aaa","LastName":"bbb"}
由於Json不包含類型信息,因此可以將其反序列化為Person
var person = JsonConvert.DeserializeObject(str, typeof(Person));
假裝它,我可以在輸出json時引入一個更改屬性名稱的合約......例如......
public class FakeTypeContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return propertyName == "_type_" ? "$type" : propertyName;
}
}
所以,如果您將json.net反序列化設置設置為
TypeNameHandling = TypeNameHandling.Objects
TypeNameAssemblyFormat = FormatterAssemblyStyle.Full
你可以像下面這樣做一個煩人的類型,
var x = new
{
_type_ = typeof(Person).AssemblyQualifiedName,
p.FirstName,
p.LastName
}
哪個會假裝成類型信息中的“人物”,這意味着如果你反序列化它,你將獲得一個人物。
注意:必須將序列化程序設置為json設置,以便在偽造時序列化類型信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.