在 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 令牌如何返回默认值而不是抛出异常的主要内容,如果未能解决你的问题,请参考以下文章