gpt4 book ai didi

c# - 如何配置 JSON.net 反序列化器来跟踪丢失的属性?

转载 作者:太空狗 更新时间:2023-10-29 22:09:09 24 4
gpt4 key购买 nike

示例类:

public class ClassA
{
public int Id { get; set; }
public string SomeString { get; set; }
public int? SomeInt { get; set; }
}

默认反序列化器:

var myObject = JsonConvert.DeserializeObject<ClassA>(str);

为两个不同的输入创建相同的对象

{"Id":5}

{"Id":5,"SomeString":null,"SomeInt":null} 

如何跟踪反序列化过程中丢失的属性并保持相同的行为?有没有办法覆盖一些 JSON.net 序列化程序方法(例如 DefaultContractResolver 类方法)来实现这一点。例如:

List<string> missingProps;
var myObject = JsonConvert.DeserializeObject<ClassA>(str, settings, missingProps);

对于第一个输入列表,应该包含缺失属性的名称(“SomeString”、“SomeInt”),对于第二个输入,它应该是空的。反序列化的对象保持不变。

最佳答案

1。 JSON 具有您的类中缺少的属性

使用属性 JsonSerializerSettings.MissingMemberHandling 您可以说缺少的属性是否作为错误处理。

你可以安装 Error委托(delegate)将注册错误。

这将检测 JSON 字符串中是否存在某些“垃圾”属性。

public class ClassA
{
public int Id { get; set; }
public string SomeString { get; set; }
}

internal class Program
{
private static void Main(string[] args)
{
const string str = "{'Id':5, 'FooBar': 42 }";
var myObject = JsonConvert.DeserializeObject<ClassA>(str
, new JsonSerializerSettings
{
Error = OnError,
MissingMemberHandling = MissingMemberHandling.Error
});

Console.ReadKey();
}

private static void OnError(object sender, ErrorEventArgs args)
{
Console.WriteLine(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
}
}

2。您的类(class)有一个 JSON 中缺少的属性

选项1:

使其成为必需的属性:

    public class ClassB
{
public int Id { get; set; }

[JsonProperty(Required = Required.Always)]
public string SomeString { get; set; }

}
选项 2:

使用一些“特殊”值作为默认值,然后检查。

public class ClassB
{
public int Id { get; set; }

[DefaultValue("NOTSET")]
public string SomeString { get; set; }
public int? SomeInt { get; set; }
}

internal class Program
{
private static void Main(string[] args)
{
const string str = "{ 'Id':5 }";
var myObject = JsonConvert.DeserializeObject<ClassB>(str
, new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Populate
});

if (myObject.SomeString == "NOTSET")
{
Console.WriteLine("no value provided for property SomeString");
}

Console.ReadKey();
}
}
选项 3:

另一个好主意是将此检查封装在类本身中。如下图创建一个Verify()方法,反序列化后调用。

public class ClassC
{
public int Id { get; set; }

[DefaultValue("NOTSET")]
public string SomeString { get; set; }
public int? SomeInt { get; set; }

public void Verify()
{
if (SomeInt == null ) throw new JsonSerializationException("SomeInt not set!");
if (SomeString == "NOTSET") throw new JsonSerializationException("SomeString not set!");
}
}

关于c# - 如何配置 JSON.net 反序列化器来跟踪丢失的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30300740/

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