gpt4 book ai didi

c# - 反序列化记录 - 如何初始化丢失的属性

转载 作者:行者123 更新时间:2023-12-05 04:50:05 25 4
gpt4 key购买 nike

考虑一个尝试反序列化缺少某些属性的记录的简单案例:

#nullable enable

record Rec(int Age, Employee Employee); // Employee has a default constructor

var rec = JsonConvert.DeserializeObject<Rec>("{\"Age\":30}");

尽管启用了 nullable,但我得到了 rec,Employee 设置为 null,没有任何编译器警告,并且必须使用默认构造函数手动设置它。

有没有办法告诉 DeserializeObject 尝试/使用默认构造函数来处理缺失的属性,而不是将它们设置为 null ?

最佳答案

有一个overload to DeserializeObject这允许您传入一个 JsonConverter 数组,它允许您自己管理类型转换(从 JObject)。或者,您也可以将默认的 JsonSerializerSettings 更改为NOT allow nulls 并手动处理引发的异常。

All of that would require a lot of boilerplate code but for simple default type instantiation, there is a CustomCreationConverter you can inherit from

class RecConverter : CustomCreationConverter<Rec>
{
public override Rec Create(Type objectType)
{
return new Rec ( 0, new Employee() { Name = "Custom" } );
}
}

Note that the default value of properties is usually defined in the declaration of the type itself.

DeserializeObject 会首先实例化对象,然后如果 MissingMemberHandling 设置为“Ignore”,它只设置可用的属性,其他的将保持默认的初始化状态,即已定义通过该类型的默认构造函数,可以通过自动属性初始化语法定义。

你可以声明你的类,默认初始化你需要的非空属性:

public class Rec
{
public int Age { get;set; }
public Employee Employee { get;set; } = new Employee();
}

类似的规则适用于 C#9 record,但是 DeserializeObject 将调用与 JSON 字符串中可用参数相匹配的相关构造函数,因此您可以使用实现相同目的的详细声明语法:

record Rec
{
public int Age { get;init; }
public Employee Employee { get;init; } = new Employee();
}

请参阅此 fiddle :https://dotnetfiddle.net/Dmpmn5

关于c# - 反序列化记录 - 如何初始化丢失的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67377385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com