c# - 通过忽略错误仅反序列化有效对象

标签 c# json.net deserialization

是否有内置方法(或技巧)仅解析有效 对象并忽略无效 对象?


不是重复的

问题Ignoring an invalid field when deserializing json in Json.Net 没有回答我的问题,因为它是关于一个非常具体的日期时间类型字段的自定义序列化程序。我正在寻找适用于任何属性(property)和任何对象的通用解决方案。

换句话说,如果任何内容无效,则忽略它并继续下一个条目。就 json 而言,文件是正确的,但某些地方的内容可能与预期的类型不匹配。它可以通过任何方式。


背景:该文件包含许多工作流和单个损坏条目不应破坏整个配置并实际上禁用它们。


这里有一个例子可以说明我的意思。假设我有一个 User 数组,但是一个条目不是使用 string 作为 Name 使用数组(它可能是任意组合无效值的集合,例如需要数组的对象。

我想反序列化这个数组并忽略无法反序列化的条目。这意味着预期结果应该是两个用户,JohnTom

我尝试使用 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/

相关文章:

c# - 使用 SQL #tempdb 将 databind() 绑定(bind)到 ListBox

c# - 如何在 C# 中设置多个整数 ReportParameter?

c# - 使用 Newtonsoft Json.NET 仅序列化派生类型

c# - 创建动态对象

c# - 如何在 asp.net mvc 中处理 'View not found' InvalidOperationException?

c# - 使用 DataContractJsonSerializer 反序列化变量类型 JSON 数组

c# - json.net,将新对象/项目添加/附加到现有 JSON 对象中

serialization - symfony 反序列化嵌套对象

C# 泛型方法作为带有 where 子句的扩展

c++ - 如何从 char 指针转换为自定义对象指针