尝试从 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 会输出一个为您提供的缩进格式版本。
我最近开始学习如何从 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 会输出一个为您提供的缩进格式版本。