在 JSON.Net 中处理不存在的 JSON 令牌如何返回默认值而不是抛出异常

Posted

技术标签:

【中文标题】在 JSON.Net 中处理不存在的 JSON 令牌如何返回默认值而不是抛出异常【英文标题】:Handling nonexistant JSON tokens in JSON.Net how to return default instead of throwin exception 【发布时间】:2018-08-22 03:22:56 【问题描述】:

我有一个问题,在http://www.pathofexile.com/api/public-stash-tabs 链接下有一个巨大的 API,它返回一个 JSON 字符串。此 JSON 中的许多字段都是可选的,这意味着它们仅在存在值时才会出现。

所以理论上的“Item1”可以具有“abyssJewel”属性,但是 “item2”不必有“abyssJewel”属性

当我尝试像这样使用 JSON.Linq 查询这个 JSON 时

AbyssJewel = (bool)item["abyssJewel"];

在 Item1 的情况下,一切都很好,它返回了正确的值 但在 Item2 的情况下,我得到异常“InvalidOperationException,无法访问 Newtonsoft.Json.Linq.JProperty 上的子值”

我理解它,因为对于 Item2,JSON 中不存在 abyssJewel 属性,因此它会引发异常。

我的问题是,我该如何处理它,而不是抛出异常,而是为该特定字段返回默认值或空值?

我尝试过使用 Activator,但无法自行完成任何工作。有什么建议吗?

我像这样实例化它:

apiPages.Add(new Page
            
                Next_Change_Id = (string)jsonObject["next_change_id"],
                Stashes = jsonObject["stashes"].Select(stash => new Stash
                
                    AccountName = (string)stash["accountName"],
                    StashName = (string)stash["stash"],
                    StashType = (string)stash["stashType"],
                    Public = (bool)stash["public"],
                    LastCharacterName = (string)stash["lastCharacterName"],
                    UniqueId = (string)stash["id"],
                    Items = stash.Select(item => new Item
                                        
                                            AbyssJewel = (bool)item["abyssJewel"],
...tl;dr...

【问题讨论】:

item是什么类型? 它来自 JSON.NET 的 JToken 您可以使用SelectTokens() 或空条件运算符,如here 所示。并且当转换为值类型时,转换为可空值,例如AbyssJewel = (bool ?)item["abyssJewel"].GetValueOrDefault(); 或者,直接反序列化为 c# 模型,根本不使用中间 JToken 表示。 我的错误是我试图将 JSON 直接反序列化为我的实体框架模型,这将需要使用 JSON 注释进行大量调整和污染模型(除非有某种 Fluent API for JSON im不知道?)。我的问题的解决方案实际上是创建一个我可以反序列化我的 JSON 的 JSON 模型。谢谢 dbc。 【参考方案1】:

您应该尝试使用 Boolean 类中的 TryParse() 方法,而不是直接强制转换,如果出现问题,它必须返回 false。 See here

希望它能解决您的问题。

【讨论】:

以上是关于在 JSON.Net 中处理不存在的 JSON 令牌如何返回默认值而不是抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

从可能不存在的 JToken 中获取价值(最佳实践)

json.net 有关键方法吗?

Json.Net 不处理反序列化 null DataTable

如何使用 JSON.net 处理同一属性的单个项目和数组

使用 Json.Net 处理数据中的换行符

JSON.net 直接从 oledbconnection 序列化