如何在C#中使用构造函数将JSON对象反序列化到自身中?

如何在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) { /

我想创建一个新对象,并在对象创建过程中进行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)
    {
        // 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不应实现其自身的持久性。