【问题标题】:Accessed JArray values with invalid key value in different json在不同的 json 中访问了具有无效键值的 JArray 值
【发布时间】:2016-02-29 15:27:21
【问题描述】:

我有这个 json:

{
     "status": true,
     "Text": "Example"
}

但有时这可能会改变,所以我需要检查传递的响应中是否有索引Text,代码:

var container = (JContainer)JsonConvert.DeserializeObject(response);
var message = container["Text"];

问题是我在消息上收到此异常(如果 json 不包含密钥 text):

{"使用无效键值访问的 JArray 值:\"Text\"。需要 Int32 数组索引。"}

如何避免这个问题?

【问题讨论】:

  • 准确的说是检查属性是否存在,然后才访问。
  • @Christoph 是的,我需要检查该属性是否存在,您链接的不是 c# 的 javascript 问题
  • 我的错。那就看看这个贴吧。转换为 JObject 并迭代 JObject.Children()。这对你有用吗?stackoverflow.com/questions/13652983/…
  • @Christoph 我发现了问题。返回的 json(导致问题的原因)包含多行,如下所示:{"trace":{"details":{"[date]":"[29-02-2016 17:07:29.773750]","[level]":"[info]","[message]":"[System Done.]"},"context":[[{"ID":"John Dillinger"}]]}}{"trace":{"details":{"[date]":"[29-02-2016 17:07:29.773750]","[level]":"[info]","[message]":"[System Done.]"},"context":[[{"ID":"John Dillinger"}]]}} 事实上,我看到如果我只放置 json 的一个“跟踪”代码工作正常,而不是多行我得到了错误。跨度>

标签: c# json


【解决方案1】:

您使用的是什么版本的 NewtonSoft?

以下导致message为null,不抛出异常。

var res = @"{""status"": true }";

var container = (JContainer)JsonConvert.DeserializeObject(res);
var message = container["Text"];

// message = null

更新:

根据您的回复,即使这样也不会引发您看到的异常:

var res = @"{}";

var container = (JContainer)JsonConvert.DeserializeObject(res);
var message = container["Text"];

更新了我的代码以使用相同的版本反映您的代码,但我仍然没有收到您所看到的异常。这就是我正在做的:

var res = @"{""trace"":{""details"":{""[date]"":""[29-02-2016 17:07:29.773750]"",""[level]"":""[info]"",""[message]"":""[System Done.]""},""context"":[[{""ID"":""John Dillinger""}]]}}";

var container = (JContainer)JsonConvert.DeserializeObject(res);
var message = container["Text"];

message 变量仍然为空。

有鉴于此,不妨尝试使用上述代码创建一个简单的控制台应用程序,看看是否遇到相同的异常?

【讨论】:

  • 我知道,代码有效。但正如我所说,如果返回的 json 与 @"{""status"": true }"; 不同,我会得到异常:{"Accessed JArray values with invalid key value: \"Text\". Int32 array index expected."} 因为密钥不存在。现在清楚了吗?
  • 你能用导致异常的代码更新你的问题,以便我可以尝试复制它吗?
  • 是同一个代码,只是传递另一个不包含Text键的json
  • 哦,我发现了问题,在try catch中我只管理WebExceptionm,但如果我用Exception替换,我就不能使用web异常的某些属性-
  • 我不明白为什么这个对象突然变成了一个 JArray。我希望 Json 必须在它周围有 [ ] 才能成为一个数组。第一个代码块中的 Json 在我看来显然是一个不应该反序列化为对象的对象。 @Sandokan,您确定在失败的情况下您收到的是 Json 对象而不是数组吗?
猜你喜欢
  • 1970-01-01
  • 2014-03-16
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多