【问题标题】:JSON Deserialize Error: The given key was not present in the dictionaryJSON反序列化错误:字典中不存在给定的键
【发布时间】:2016-10-05 10:44:27
【问题描述】:

我正在尝试将 JSON 输出到 Web 表单中的下拉列表。我已经做到了这一点:

WebClient client = new WebClient();
string getString = client.DownloadString("http://myfeed.com/app_feed.php");

JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize<object>(getString);
string name = item["title"];

return name;

这使提要恢复正常,但它在行上遇到错误:

string name = item["title"];

返回此错误:

附加信息:给定的键不在字典中。

这是我的提要示例:

{"apps":[{"title":"title1","description":"description1"},    
{"title":"title2","description":"description2"},
{"title":"title3","description":"description3"}

所以我以为我引用了第一个标题,我打算循环浏览它们:

string name = item["title"];

但显然不是! 我查看了 Stackoverflow,但找不到可以应用于我自己的代码的答案。

【问题讨论】:

  • 只是一个建议:我建议您创建一些可以使用和迭代的强类型 C# 类,而不是将您的 JSON 反序列化为 dynamic 对象。你可以使用json2csharp.com来帮助你,或者VS中的内置工具>Edit>Paste Special>Paste JSON As Classes:)
  • 示例 Feed 中缺少 ']}'。它是完整的提要吗?
  • 我认为这只是一个错字@Arshad

标签: c# .net json visual-studio-2015 deserialization


【解决方案1】:

title 在另一个键 apps 内,它是一个数组,所以你应该迭代它,我告诉你只需使用索引 0 选择第一个

string name = item["apps"][0]["title"];

你可以通过foreach访问所有

foreach (var ap in item["apps"])
{
    Console.WriteLine(ap["title"]);
}

【讨论】:

    【解决方案2】:

    首先,您的 JSON 无效。第二:您需要遍历您的项目,因为它是一个数组。如果你想访问第一个,你可以这样做:item["apps"][0]["title"]

    遍历所有项目:

    var str = @"{""apps"":[{""title"":""title1"",""description"":""description1""},    
    {""title"":""title2"",""description"":""description2""},
    {""title"":""title3"",""description"":""description3""}]}";
    
    var serializer = new JavaScriptSerializer();
    dynamic obj = serializer.Deserialize<object>(str);
    foreach (var item in obj["apps"])
    {
        Console.WriteLine("item title: " + item["title"]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多