簡體   English   中英

如何在序列化時偽造JSON.NET中的類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM