C# JSON补丁更新嵌套对象

C# JSON补丁更新嵌套对象,c#,json,asp.net-core,json-patch,C#,Json,Asp.net Core,Json Patch,我一直在尝试使用JSON补丁在嵌套对象中使用replace值,但是我觉得我的符号不正确。你知道这条路应该是什么吗 我已经创建了下面的代码来证明它 void Main() { var patchTest=新的patchTest(); patchTest.Create(); patchTest.ToString().Dump(“补丁前”); var patch=JsonConvert.DeserializeObject( @"[ { “op”:“替换”, “路径”“:”“/firstname”“,

我一直在尝试使用JSON补丁在嵌套对象中使用replace值,但是我觉得我的符号不正确。你知道这条路应该是什么吗

我已经创建了下面的代码来证明它

void Main()
{
var patchTest=新的patchTest();
patchTest.Create();
patchTest.ToString().Dump(“补丁前”);
var patch=JsonConvert.DeserializeObject(
@"[
{
“op”:“替换”,
“路径”“:”“/firstname”“,
“值”:“本杰明”
},
{
“op”:“替换”,
“路径”:“年龄”,
“值”:“29”
},
{
“op”:“替换”,
“”路径“”:“”//约会//名称“”,
“值”:“fsdfdsf”
},
]");
补丁测试。补丁(补丁);
patchTest.ToString().Dump(“补丁后”);
}
公共类补丁测试
{
公共联系人{get;set;}
公共补丁测试(){}
公共void Create()
{
联系人=新联系人
{
FirstName=“沃尔特”,
LastName=“银行”,
年龄=20
};
}
公共无效修补程序(JsonPatchDocument修补程序)
{
patch.Replace(e=>e.Appointment,Contact.Appointment);
patch.ApplyTo(联系人);
}
公共重写字符串ToString()
{
返回$“{nameof(Contact)}:{Contact}”;
}
}
公共类联系人
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共整数{get;set;}
公开约会{get;set;}
公共重写字符串ToString()
{
返回$“{nameof(FirstName)}:{FirstName},{nameof(LastName)}:{LastName},{nameof(约会)}:{Appointment}”;
}
}
公开课任命
{
公共字符串名称{get;set;}
公共重写字符串ToString()
{
返回$“{nameof(Name)}:{Name}”;
}
}
但是,它找不到名称


它找不到约会名称的原因是您在创建
联系人时未初始化
约会。将创建更改为:

public void Create()
{
    Contact = new Contact
    {
        FirstName = "Walt",
        LastName = "Banks",
        Age = 20,
        Appointment = new Appointment()
    };
}
现在,在控制台应用程序中运行示例将生成以下输出:

Before Patch
Contact: FirstName: Walt, LastName: Banks, Age: 20, Appointment: Name:
After Patch
Contact: FirstName: Benjamin, LastName: Banks, Age: 29, Appointment: Name: fsdfdsf
我将
Contact.Age
添加到它的
ToString()
覆盖中,因为它丢失了。此外,单
/
和双
/
都在路径中工作。我猜你在试图找出问题所在时使用了后者

现在,由于您已经用JSON定义了文档,因此不需要定义另一个替换操作。您的
补丁
方法可以简化为:

public void Patch(JsonPatchDocument<Contact> patch)
{
    patch.ApplyTo(Contact);
}

这将再次生成所需的输出。但是您仍然必须确保嵌套属性已初始化,否则您将遇到原始问题。

您正在尝试为
约会
上未初始化的
名称
属性设置值。在创建新仪器时,更新
联系人
类以初始化属性:

public class Contact
{
    public Contact()
    {
        Appointment = new Appointment();
    }

    ...
}
根据经验,您应该尝试初始化所有类似的属性,以确保其他类不会出现类似的问题

public void Patch(Contact amendedContact)
{
    var patch = new JsonPatchDocument<Contact>();
    patch.Replace(e => e.FirstName, amendedContact.FirstName);
    patch.Replace(e => e.Age, amendedContact.Age);
    patch.Replace(e => e.Appointment.Name, amendedContact.Appointment.Name);
    patch.ApplyTo(Contact);
}
var amendedContact = new Contact
{
    FirstName = "Benjamin",
    Age = 29,
    Appointment = new Appointment
    {
        Name = "fsdfdsf"
    }
};

patchTest.Patch(amendedContact);
public class Contact
{
    public Contact()
    {
        Appointment = new Appointment();
    }

    ...
}