C# 序列化时如何在JSON.NET中伪造类型?
假设我有C# 序列化时如何在JSON.NET中伪造类型?,c#,json.net,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",
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时,它将序列化(然后用于反序列化)类型。我想做的是在Havertmous类中伪造类型,这样当它被序列化时,它看起来像一个“Person”对象
有没有一个简单的好方法
注意:它必须在Json($type)中包含Json.Net类型信息。所以LBs answer并不能解决这个问题,事实上我可以使用.net Framework 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
}
它将在类型信息中假装为“Person”,这意味着如果您反序列化它,您将得到一个Person对象
注意:json设置的序列化程序必须设置为在伪造类型信息时不序列化类型信息。您不能使用
新人{FirstName=”“,LastName=“”}
?是。。。。。。仍然会有一个带有“PhoneNumber”的对象。在这个例子中,我不希望电话号码序列化(这是一个人为的例子,提出这个问题,实际上,对象模型是复杂的)。我更新了这个例子,试图让它更清晰。我不相信这是正确的答案。我认为OP需要将对象序列化为$type
设置为Person
,以便以后可以反序列化,而不必知道对象类型。我不相信这是正确的答案,这不是正确的答案
@KeithNicholas@CAbbott有什么问题吗?你到底期望什么?证明您的答案是正确的,因为当对象模型更复杂时,您需要类型信息(尤其是子分类)。我的问题是如何用匿名类型伪造类型信息。因为当对象模型更复杂时,您需要的类型信息不是答案。你可能不需要它。只要问问你真正的问题并找到解决办法。它认为这是Json.NET文档中的某种XY问题:TypeNameHandling控制Json.NET在使用$type属性进行序列化期间是否包含.NET类型名称,并从该属性读取.NET类型名称以确定在反序列化期间要创建的类型。