是否有一种内置方式(或技巧(仅解析有效对象,而忽略无效> 不是重复的 在json.net中的json进行审议时忽略无效字段的问题 没有回答我的问题,因为它是关于日期时间类型非常特定字段的自定义序列化器。我正在寻找适用于任何属性和任何对象的通用解决方案。 换句话说,如果有任何事情是无效的,请忽略它,然后限制下一个条目。就JSON而言,文件是正确的,但内容可能与某些地方的预期类型不匹配。它可以用任何东西。 背景:该文件包含许多 Workflows的数组和单个损坏的条目不应破坏整个配置并实际上都禁用它们。 这是一个示例,说明我的意思。假设我有一个 我想对此阵列进行挑选,而忽略了无法被挑选的条目。这意味着预期的结果应该是两个用户, john & tom 。 我尝试使用User
s数组,但是一个条目而不是使用string
用于Name
使用数组(它可以通过无效值的任何组合,例如预期数组的对象。Error
处理程序,但它不起作用。它不允许我跳过错误。void Main()
{
var json = @"
[
{
'Name': 'John',
},
{
'Name': [ 'John' ]
},
{
'Name': 'Tom',
},
]
";
var users = JsonConvert.DeserializeObject<IEnumerable<User>>(json, new JsonSerializerSettings
{
Error = (sender, e) =>
{
e.Dump();
e.ErrorContext.Handled = true;
e.CurrentObject.Dump();
}
}).Dump();
}
class User
{
public string Name { get; set; }
}
i以这种方式解决。不优雅。
var users = JsonConvert.DeserializeObject<IEnumerable<Object>>(json);
var usersList = users.ToList().Select(x =>
{
try { return JsonConvert.DeserializeObject<User>(JsonConvert.SerializeObject(x)); } catch { return null; }
}
).Where(x=> x != null).ToList<User>();
我如何处理类似情况的一个很好的例子是,在try
/catch
块中专门具有一组不同的JsonSerializerSettings
配置。
例如:
JsonSerializerSettings jsonSetting = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore };
上述代码块可以在catch
的try
之后完成,并且无法完成JSON的解析。
您的try
块可能具有正常的错误行为:
jsonSetting = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error };
提供类似的错误处理,当错误时,它会掉入catch
块中以忽略缺失字段。
但是,这取决于您是否可以跳过数据,还是要解析所有内容。这确实是根据您的实际JSON数据集的逐案基础。
将其放在try
/catch
块上方,并根据您的特定数据集使用jsonSetting
通过。
编辑:只是为了强调,我确实想指出,您提供的样本不是使用此方法接近接近的途径,但它确实使我可以跳过null的数组,或者在我的情况中具有无效的数据。这确实取决于您的数据集,但这可能是至少追求或考虑的有用途径。
我知道这个问题有点老,但只是参考:
您可以使用jsonserializersettings处理解析错误。这使您可以记录发现的任何错误,在这种情况下,标记了处理的错误,因此解析继续:
new JsonSerializerSettings
{
Error = delegate(object sender, ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}