如何在C#中使用构造函数将JSON对象反序列化到自身中?
我想创建一个新对象,并在对象创建过程中进行RPC调用以获取其属性,然后返回用属性填充的对象。请参见此示例:如何在C#中使用构造函数将JSON对象反序列化到自身中?,c#,json,deserialization,json-deserialization,C#,Json,Deserialization,Json Deserialization,我想创建一个新对象,并在对象创建过程中进行RPC调用以获取其属性,然后返回用属性填充的对象。请参见此示例: using Newtonsoft.Json; class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Person(int Id) { /
using Newtonsoft.Json;
class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Person(int Id)
{
// here would be an RPC call to get the FirstName,LastName. result is JSON
string result = "{\"Id\": 1, \"FirstName\": \"Bob\", \"LastName\": \"Jones\"}";
this = JsonConvert.DeserializeObject<Person>(result);
}
}
class Program
{
static void Main(string[] args)
{
var p = new Person(1);
// p.FirstName should be Bob
}
}
使用Newtonsoft.Json;
班主任
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公众人士(国际身份证)
{
//这里将有一个RPC调用来获取FirstName,LastName。结果是JSON
字符串结果=“{\'Id\':1,\'FirstName\':\'Bob\',\'LastName\':\'Jones\'”;
this=JsonConvert.DeserializeObject(结果);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var p=新员工(1);
//名字应该是鲍勃
}
}
不知道如何在构造函数中做到这一点而不得到堆栈溢出异常。
< P>一个选项是在代码< >人>代码>:< /P>中使用静态方法public static Person GetPerson(int Id)
{
// here would be an RPC call to get the FirstName,LastName. result is JSON
string result = "{\"Id\": 1, \"FirstName\": \"Bob\", \"LastName\": \"Jones\"}";
return JsonConvert.DeserializeObject<Person>(result);
}
publicstaticperson-GetPerson(int-Id)
{
//这里将有一个RPC调用来获取FirstName,LastName。结果是JSON
字符串结果=“{\'Id\':1,\'FirstName\':\'Bob\',\'LastName\':\'Jones\'”;
返回JsonConvert.DeserializeObject(结果);
}
这避免了原始代码的递归性质
另一个选项是将
类
更改为结构
struct
s允许您分配给此
(与类
es不同)。而且它们有一个默认构造函数(与使用参数的构造函数不同),因此没有递归行为。您将获得StackOverflow异常,因为反序列化对象创建了一个新对象,即它调用构造函数。构造函数调用反序列化对象,即创建了一个无内德循环。var p=Person.StaticFactoryMethod(1)代码>-尽管模型或DTO不应实现其自身的持久性。