是否有内置方法(或技巧)仅解析有效 对象并忽略无效 对象?
不是重复的
问题Ignoring an invalid field when deserializing json in Json.Net 没有回答我的问题,因为它是关于一个非常具体的日期时间类型字段的自定义序列化程序。我正在寻找适用于任何属性(property)和任何对象的通用解决方案。
换句话说,如果任何内容无效,则忽略它并继续下一个条目。就 json 而言,文件是正确的,但某些地方的内容可能与预期的类型不匹配。它可以通过任何方式。
背景:该文件包含许多工作流和单个损坏条目不应破坏整个配置并实际上禁用它们。
这里有一个例子可以说明我的意思。假设我有一个 User
数组,但是一个条目不是使用 string
作为 Name
使用数组(它可能是任意组合无效值的集合,例如需要数组的对象。
我想反序列化这个数组并忽略无法反序列化的条目。这意味着预期结果应该是两个用户,John 和 Tom。
我尝试使用 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; }
}
最佳答案
我是这样解决的。不优雅。
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>();
关于c# - 通过忽略错误仅反序列化有效对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56081519/