C# JSON补丁更新嵌套对象
我一直在尝试使用JSON补丁在嵌套对象中使用replace值,但是我觉得我的符号不正确。你知道这条路应该是什么吗 我已经创建了下面的代码来证明它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”“,
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();
}
...
}