仅通过忽略错误而仅进行有效的对象



是否有一种内置方式(或技巧(仅解析有效对象,而忽略无效>


不是重复的

在json.net中的json进行审议时忽略无效字段的问题 没有回答我的问题,因为它是关于日期时间类型非常特定字段的自定义序列化器。我正在寻找适用于任何属性和任何对象的通用解决方案。

换句话说,如果有任何事情是无效的,请忽略它,然后限制下一个条目。就JSON而言,文件是正确的,但内容可能与某些地方的预期类型不匹配。它可以用任何东西。


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


这是一个示例,说明我的意思。假设我有一个User s数组,但是一个条目而不是使用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; }
}

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 };

上述代码块可以在catchtry之后完成,并且无法完成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; 
    }
}

相关内容

  • 没有找到相关文章

最新更新