如何在序列化时伪造JSON.NET中的类型?

时间:2011-10-31 20:16:57

标签: c# json.net

让我说我有

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工具来做到这一点。

2 个答案:

答案 0 :(得分:2)

您可以序列化为

string str = JsonConvert.SerializeObject(new { FirstName = "aaa", LastName = "bbb" })

你会得到一个看似Person对象的字符串

{"FirstName":"aaa","LastName":"bbb"}

由于Json不包含类型信息,您可以将其反序列化回Person

var person = JsonConvert.DeserializeObject(str, typeof(Person));

答案 1 :(得分:2)

伪造它,我可以在输出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
}

哪个会假装成类型信息中的“Person”,这意味着如果你反序列化它,你将得到一个人物。

注意:必须将序列化程序设置为json设置,以便在伪造时序列化类型信息。