gpt4 book ai didi

c# - Newtonsoft json 将缺失的 int 值反序列化为空值而不是零

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:02 27 4
gpt4 key购买 nike

是否可以通过这种方式调整 JsonSerializerSettings?

(我猜不是)但仍有一些希望,因为我对他们的 API 不是很有经验。

默认情况下,在所有设置下,我都尝试过丢失 int 反序列化为 0 或导致异常。

例子

   {
"defaultCaptionLineNum": 6,
"worksheets": {
"0": { "name": "Ws1", "caption_ln": 6 },
"1": { "name": "Ws2", "caption_ln": null },
"2": { "name": "Ws3" },
"3": { "name": "Ws4", "caption_ln": 5 },
}
}

目前 Ws3 的默认字幕行 (caption_ln) 评估为 0,我希望它被评估为 null(如 Ws2 中)。

我正在使用

jObject.ToObject<MyClass>(JsonSerializer.Create(settings));

从 JSON 中获取带有工作表 (Ws) 信息的对象(也尝试过不使用序列化程序)

以及此处 IncludeIgnore 的任何变体不会使 jObject 以不同方式反序列化 json 中缺失的整数(除了立即抛出缺失值错误)

var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Include,
MissingMemberHandling = MissingMemberHandling.Ignore
};

其他序列化器设置似乎无关紧要。

更新: MyObject MyClass 的列表。

public class MyClass
{
public class WorkSheet
{
[JsonProperty("name")]
string wsName;

[JsonProperty("caption_ln")]
int? captionLineNumber;

public WorkSheet(string name, int captionln)
{
wsName = name;
captionLineNumber = captionln;
}
}
private int _defaultCaptionLineNum;

[JsonProperty("defaultCaptionLineNum")]
public int DefaultCaptionLineNum { get => _defaultCaptionLineNum; }

private Dictionary<int, WorkSheet> _worksheets = new Dictionary<int, WorkSheet>();

[JsonProperty("worksheets")]
public Dictionary<int, WorkSheet> Worksheets { get => _worksheets; set => _worksheets = value; }

public MyClass()
{
Console.WriteLine("New MyClass object created!");
}
}

最佳答案

你的问题是你的类型 WorkSheet 只有一个构造函数,它是参数化的:

public class WorkSheet
{
public WorkSheet(string name, int captionln)
{
wsName = name;
captionLineNumber = captionln;
}

// Remainder omitted
}

如文档页面中所述ConstructorHandling Enumeration , Json.NET 在没有无参构造函数的情况下会退回到单参数化构造函数,这里就是这种情况。对于构造函数参数,Json.NET 将按名称(模大小写)将 JSON 参数与构造函数参数匹配,如果存在则反序列化为参数类型,如果不存在则传递默认值。由于您的 JSON 中不存在 "captionln" 参数,captionLineNumber 被初始化为 default(int)0。这解释了您遇到的问题。

要解决此问题,您可以将 captionln 更改为 int? 类型:

public class WorkSheet
{
public WorkSheet(string name, int? captionln)
{
wsName = name;
captionLineNumber = captionln;
}

// Remainder omitted
}

工作 fiddle #1 here .

或者,您可以引入一个私有(private)的特定于序列化的构造函数并用[JsonConstructor] 标记它。 :

public class WorkSheet
{
[JsonConstructor]
private WorkSheet() { }

public WorkSheet(string name, int captionln)
{
wsName = name;
captionLineNumber = captionln;
}

// Remainder omitted
}

示例 fiddle #2 here .

Json.NET中构造函数使用的相关问题:

关于c# - Newtonsoft json 将缺失的 int 值反序列化为空值而不是零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52169522/

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