gpt4 book ai didi

c# - JSON.NET 中对象集合的错误处理行为与简单类型不同

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:13 25 4
gpt4 key购买 nike

我在这上面花了大约一天的时间。如果我有一个简单对象的集合,比如 json 中的日期时间,我可以将它正确地反序列化为有效的对象和错误。对一组更复杂的对象使用完全相同的方法会得到完全不同的结果:有问题的一个对象会阻止所有其他对象被正确创建。我尝试了各种其他方法,例如使用 JsonTextReader 通过 json 查找对象,但它永远无法通过错误的 bool 值“tru”。

基本上我希望能够反序列化所有好的值并跳过坏的值。

我在文档中找不到任何关于这种行为差异的信息。我还查看了各种与解析和处理错误相关的 stackoverflow 文章,但没有成功。非常感谢任何见解。

在此代码中,您得到 3 个正确的日期时间和 3 个错误。

private void WorkingDeserializer()
{
List<string> errors = new List<string>();

List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(
@"[
'2009-09-09T00:00:00Z',
'I am not a date and will error!',
[
1
],
'1977-02-20T00:00:00Z',
null,
'2000-12-01T00:00:00Z'
]",
new JsonSerializerSettings
{
Error = delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
}
});
}

在这段代码中,你没有得到任何有用的值,只有错误

public class FeatureSwitch
{
public string Name { get; set; }
public string Description { get; set; }
public bool Status { get; set; }
}

private void NonWorkingDeserializer()
{
List<string> errors = new List<string>();

List<FeatureSwitch> c = JsonConvert.DeserializeObject<List<FeatureSwitch>>(
@"[
{
'Name': 'TestSwitch1',
'Description': 'TestSwitch1_Desc',
'Status': false
},
{
'Name': 'TestSwitch2',
'Description': 'bad format',
'Status': tru
},
{
'Name': 'TestSwitch3',
'Description': 'should be good',
'Status': true
}
]", new JsonSerializerSettings
{
Error = delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
}
});
}

最佳答案

这是因为您在第二个示例中使用非法 json 语法破坏了 json 序列化。您没有像第一个示例那样破坏日期时间或模型的解析。

所以问题与复杂对象无关。如果您在 NonWorkingDeserializer 中获取 tru 并将其作为您想要在简单日期时间序列化程序中出错的值之一,您将得到相同的三个错误。错误列表中的三个错误与值 tru 的位置有关。它们与不工作的反序列化器 json 字符串中的 3 个模型对象无关。即使你尝试用其中的 10 个对象创建一个 json 字符串,你也会得到与值 tru

相关的 3 个错误

这是因为您正尝试使用损坏的语法反序列化 JSON。

JSON中的 bool 值语法如下:

它包括真值或假值。

var json-object-name = { string : true/false, .......}

你正在用 bool 语法编写 json 但没有给出正确的值

var json-object-name = { string : tru }

字符串的语法如下:

var json-object-name = { string : "string value"}

数组的语法如下:

[ value, .......]

null 的语法如下:

null

数字的语法如下:

var obj = {marks: 97}

Json 中可用的不同值及其语法:

  • 字符串
  • 数量
  • 对象数组
  • 正确
  • 错误

如果你将 tru 设为 json 字符串 'tru' 你将得到你想要的解析错误,而不是你得到的损坏的 json 语法错误,例如

List<string> errors = new List<string>();

List<FeatureSwitch> c = JsonConvert.DeserializeObject<List<FeatureSwitch>>(
@"[
{
'Name': 'TestSwitch1',
'Description': 'TestSwitch1_Desc',
'Status': false
},
{
'Name': 'TestSwitch2',
'Description': 'bad format',
'Status': 'tru'
},
{
'Name': 'TestSwitch3',
'Description': 'should be good',
'Status': true
}
]", new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
}
});

这会为您提供计数为 3 的 FeatureSwitch 列表,并且会给出一个错误,因为您没有破坏 json 本身。

您想要做的就像在 json 字符串中键入一个 Lorem Ipsum 段落,然后在其中随机放置一点有效的 json,并期望反序列化器能够找到您的模型。

例如

  List<string> errors = new List<string>();

List<FeatureSwitch> c = JsonConvert.DeserializeObject<List<FeatureSwitch>>(
@"[Maecenas nulla mauris, bibendum ac orci ut, consectetur egestas nisl. Morbi purus nibh, consectetur vel aliquet id, dictum vitae ante.
Maecenas cursus nunc orci, quis sollicitudin lorem dictum et. In molestie turpis tortor, eget aliquet nunc finibus sed. Proin vel dui nec eros pretium congue.
Pellentesque vitae tempor dui. Aliquam molestie,
{
'Name': 'TestSwitch1',
'Description': 'TestSwitch1_Desc',
'Status': false
}
dolor nec gravida molestie, felis neque vestibulum lorem, sed tempus arcu ligula at tortor.
Duis ac augue tincidunt odio convallis consectetur. Nam blandit mi ac purus convallis vulputate. Proin eget pretium lacus. Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Praesent sem ante, gravida et dignissim egestas, commodo tincidunt sapien.]", new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
}
});

关于c# - JSON.NET 中对象集合的错误处理行为与简单类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47230850/

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