Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化时如何在JSON.NET中伪造类型?_C#_Json.net - Fatal编程技术网

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类型名称以确定在反序列化期间要创建的类型。