我想知道json中的某个属性是否被跳过或提供为null。为此,我使用了这样的setter标志。这工作正常,但它的丑陋得多,我将不得不创建每一个属性,我想检查标志。有没有一个更简洁的解决方案,创建一个自定义类,具有像isSet,Value这样的函数?
public class Tmp2
{
private int a;
public bool isASet;
private int? b;
public bool isBSet;
public int A { get { return a; }
set { a = value; isASet = true; } }
public int? B { get { return b; }
set { b = value; isBSet = true; } }
}
寻找更好的解决方案
2条答案
按热度按时间eiee3dmh1#
您可以采用问题 Custom JSON serializer for optional property with System.Text.Json by Maxime Rossini中的
Optional<T>
模式,将值 Package 在Optional<T>
结构中,该结构跟踪值是否被初始化。由于您使用的是Json.NET,因此需要从System.Text.Json中移植其逻辑。首先,定义以下接口、结构体和转换器:
现在修改你的类(这里是
Tmp2
),用Optional<T>
Package 器替换你想要跟踪的每个属性的值,如下所示:现在,您将能够通过检查
value.HasValue
来判断是否设置了任何特定值,例如:为了在序列化时抑制未设置属性的输出,您有两个选项:
1.用[
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm)标记每个属性: 序列化对象时忽略成员值与成员默认值相同的成员,以便不将其写入JSON。 1.引入一个自定义协定解析程序,它自动禁止未设置属性值的序列化。 上面的
Tmp2`版本使用方法#1,但如果您更喜欢#2,请定义以下合约解析器:并按如下方式简化模型:
您现在可以使用以下设置往返
Tmp2
并跟踪属性的存在:演示小提琴here。
laawzig22#
如果不想向类中添加任何额外代码,可以创建一个通用 Package 器类。此类可用于任何数据模型。
测试
试验结果
以及如何在控制器动作中使用 Package 器