与简单类型相比,JSON.NET中对象集合的错误处理行为有所不同



我为此花了大约一天的时间。如果我有一个简单对象的集合,比如json中的datetime,我可以正确地将其反序列化为有效的对象和错误。对更复杂的对象集合使用完全相同的方法会给我带来完全不同的结果:出现问题的一个对象会阻止所有其他对象的正确创建。我尝试过各种其他方法,比如使用JsonTextReader来遍历json查找对象,但它永远无法通过错误的布尔值"tru"。

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

我在文档中找不到任何关于这种行为差异的信息。我还查看了各种与解析和处理错误有关的文章,但没有运气。任何见解都将不胜感激。

在这段代码中,您得到了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中的布尔值语法如下:

它包括真值或假值。

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

您使用布尔语法编写json,但没有给出正确的值

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

字符串的语法如下:

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

数组的语法如下:

[ value, .......]

null的语法如下:

null

数字的语法如下:

var obj = {marks: 97}

Json:中提供的不同值及其语法

  • 字符串
  • 数字
  • 对象数组
  • 真的
  • 虚假的
  • NULL

如果您将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;
}
});

相关内容

  • 没有找到相关文章

最新更新