【问题标题】:"Cannot access child value on Newtonsoft.Json.Linq.JValue."“无法访问 Newtonsoft.Json.Linq.JValue 上的子值。”
【发布时间】:2021-08-09 09:18:54
【问题描述】:

对不起,如果这是一个基本的,我对此很陌生。

我有一个带有 JSON 数据的 JObject jObj,它可能有也可能没有子对象。

场景 1

  },
  "feedback": {
    "rating": false,
    "comment": "test"
  },

场景 2

  },
  "feedback": null,

我想要做的是处理这两种情况,最初我认为如果子对象不存在我可以用 null 进行评估,但它似乎没有那么简单。

var jObj = (JObject)JsonConvert.DeserializeObject(JSON, new JsonSerializerSettings() { DateParseHandling = DateParseHandling.None });

string rating = (string)jObj["feedback"]["rating"];
string rating_comment = (string)jObj["feedback"]["rating_comment"];

场景 1 很有效,但场景 2 抛出以下异常。

“无法访问 Newtonsoft.Json.Linq.JValue 上的子值。”

然后我尝试了一种不同的方法,试图在我引用反馈键之前评估“反馈”是否有对象。

JObject jObjFeedback = (JObject)jObj.GetValue("feedback");
bool containsFeedback = jObjFeedback.ContainsKey("rating");

if (containsFeedback)
{
    rating = (string)jObj["feedback"]["rating"];
    rating_comment = (string)jObj["feedback"]["rating_comment"];
}
else
{
    log.Info("No feedback rating found");
}

由于反馈对象存在,这同样适用于场景 1,但当它不存在时,我得到以下异常。

“无法将 'Newtonsoft.Json.Linq.JValue' 类型的对象转换为类型 'Newtonsoft.Json.Linq.JObject'"

我确信必须有一种简单的方法来处理这两种情况,不幸的是我似乎找不到它。

非常感谢任何帮助。

【问题讨论】:

    标签: c# json linq json.net


    【解决方案1】:

    使用HasValues 属性检查反馈是否有子对象

    var jObj = (JObject)JsonConvert.DeserializeObject(JSON, new JsonSerializerSettings() { DateParseHandling = DateParseHandling.None });
    
    if(jObj.GetValue("feedback").HasValues)
    {
        var rating = (string)jObj["feedback"]["rating"];
        var rating_comment = (string)jObj["feedback"]["rating_comment"];
    }          
    else
    {
        log.Info("No feedback rating found");
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-23
      • 1970-01-01
      • 2019-08-24
      • 2021-08-21
      • 2018-12-19
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 2012-04-18
      相关资源
      最近更新 更多