我有一个具有各种属性的对象模型MyObject.有一次,我有两个这样的MyObject实例:实例A和实例B.如果实例B具有非空值,我想将实例A中的属性与实例B的属性进行复制和替换.
如果我只有1个具有3个属性的类,没问题,我可以轻松地对其进行硬编码(这是我开始做的).但实际上我有12个不同的对象模型,每个模型大约有10个属性.
有什么好办法呢?
在 ASP.Net Core 2.2 中使用 JSON.Net 时,当序列化为 JSON 时,当其值为 null 时,我能够忽略属性:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public DateTime? Created { get; set; }
Run Code Online (Sandbox Code Playgroud)
但是,当使用内置于 JSON (System.Text.Json) 的新 ASP.Net Core 3.0 时,如果某个属性的值为 null,我找不到可以忽略该属性的等效属性。
我只能找到 JsonIgnore。
我错过了什么吗?
json json.net asp.net-core-3.0 .net-core-3.0 system.text.json
在我之前的一个问题中,我询问如何使用 System.Text.Json填充现有对象。
一个很好的答案展示了一种解决方案,用 解析 json 字符串JsonDocument并用 枚举它EnumerateObject。
随着时间的推移,我的 json 字符串不断演变,现在还包含一个对象数组,当使用链接答案中的代码解析它时,它会抛出以下异常:
The requested operation requires an element of type 'Object', but the target element has type 'Array'.
Run Code Online (Sandbox Code Playgroud)
我发现人们可以以一种方式或另一种方式寻找JsonValueKind.Array, 并做这样的事情
if (json.ValueKind.Equals(JsonValueKind.Array))
{
foreach (var item in json.EnumerateArray())
{
foreach (var property in item.EnumerateObject())
{
await OverwriteProperty(???);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法做到这一点。
如何做到这一点并作为通用解决方案?
我想获得“结果 1”,其中添加/更新数组项,以及“结果 2”(当传递变量时),其中整个数组被替换。
对于“结果2”,我假设可以if (JsonValueKind.Array))在OverwriteProperty方法中检测到,以及在哪里/如何传递“replaceArray”变量?...在迭代数组或对象时?
一些示例数据:
Json 字符串首字母
{
"Title": "Startpage", …Run Code Online (Sandbox Code Playgroud) 是否可以将这样的两个 json 对象与 System.Text.Json?
对象 1
{
id: 1
william: "shakespeare"
}
Run Code Online (Sandbox Code Playgroud)
对象 2
{
william: "dafoe"
foo: "bar"
}
Run Code Online (Sandbox Code Playgroud)
结果对象
{
id: 1
william: "dafoe"
foo: "bar"
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样用 newtonsoft.json 实现它
var obj1 = JObject.Parse(obj1String);
var obj2 = JObject.Parse(obj2String);
obj1.Merge(obj2);
result = settings.ToString();
Run Code Online (Sandbox Code Playgroud)
但是有办法System.Text.Json吗?