让我说我有
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工具来做到这一点。
答案 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设置,以便在伪造时序列化类型信息。