【发布时间】: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。