尝试从 api 解析 json 时出现 RuntimeBinderException

RuntimeBinderException when trying to parse json from api

我最近开始学习如何从 REST API 中获取数据,但遇到了一个问题。

到目前为止,这是我的代码:

   <!-- language-all: lang-c# -->

   using System...
   using Newtonsoft.Json.Linq; 
   //I use JSON.NET V.6.0.7 for faster and less complicated parsing
   ...
   ...

    WebClient client = new WebClient(); //Creates the client
    Stream stream = client.OpenRead("INSERT API URL HERE"); //Calls the API
    StreamReader reader = new StreamReader(stream); //Convert the information

    dynamic data = JObject.Parse(reader.ReadToEnd()); //Parses JSON into an object

    Console.WriteLine(data); //Writes out the information


        }
    }
}

到目前为止我的代码工作正常,唯一的问题是我一次得到了很多不必要的信息

我尝试将 Console.WriteLine(data); 更改为 Console.WriteLine(data.author);

我试图获取所有作者的姓名,却收到一条错误消息

'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 类型的未处理异常发生在 System.Core.dll

这是为什么?我该如何解决?

我曾尝试搜索答案,但确实找到了类似的帖子here,但它对我没有帮助。

任何帮助将不胜感激!

我的母语不是英语,所以我对任何奇怪的语法表示歉意use/misspelling。

您的 JSON(您没有包含在问题中)不得包含名为 author 的顶级对象。每当您尝试 use a property of a dynamic object that does not exist 时都会抛出该异常。因此,author 不能作为顶级 JSON 对象存在。检查以确保您具有正确的字段名称;也许它实际上是 Author 或类似的东西。或者它可能嵌套在您需要提取的某个中间容器中。

如果您确实有正确的字段名称,但它在某些情况下根本不会出现,您可以使用 try/catch 块,或解析为 JToken instead of dynamic and use Linq to Json 方法来访问数据,例如:

var jToken = JToken.Parse(reader.ReadToEnd());

var author = jToken["author"];
if (author != null)
    Console.WriteLine(author.ToString());

如果你不确定你的 JSON 字符串的结构,因为它很长而且没有缩进,你可以做 Debug.WriteLine(JToken.Parse(reader.ReadToEnd()),在这种情况下 Json.NET 会输出一个为您提供的缩进格式版本。