Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在RestSharp中解析JSON返回;System.NullReferenceException:对象引用未设置为对象的实例;_C#_Json - Fatal编程技术网

C# 在RestSharp中解析JSON返回;System.NullReferenceException:对象引用未设置为对象的实例;

C# 在RestSharp中解析JSON返回;System.NullReferenceException:对象引用未设置为对象的实例;,c#,json,C#,Json,我正在制作一个用户界面,其中用户输入股票符号/股票代码,然后按下一个按钮以获取股票的开盘价、高价、低价和收盘价等数据。我一直在用这个。这显示了我在这个问题中使用的API调用的JSON数据,在过去的100天里,我每天都在使用微软股票。为了获得从今天开始的最后100个工作日(或工作日:周一至周五),我使用以下C代码: 除了我一直在为此行获取“System.NullReferenceException:对象引用未设置为对象的实例”: var open = JObject.Parse(response.

我正在制作一个用户界面,其中用户输入股票符号/股票代码,然后按下一个按钮以获取股票的开盘价、高价、低价和收盘价等数据。我一直在用这个。这显示了我在这个问题中使用的API调用的JSON数据,在过去的100天里,我每天都在使用微软股票。为了获得从今天开始的最后100个工作日(或工作日:周一至周五),我使用以下C代码:

除了我一直在为此行获取“System.NullReferenceException:对象引用未设置为对象的实例”:

var open = JObject.Parse(response.Content)["Time Series (Daily)"][date.ToString("yyyy-MM-dd")]["1. open"];
我检查了
date.ToString(“yyyy-MM-dd”)
代码的输出,它与Alpha Vantage的JSON格式并行,就像今天的“2020-01-12”。我自己也试着输入一个日期字符串,结果成功了:

var open = JObject.Parse(response.Content)["Time Series (Daily)"]["2020-01-10"]["1. open"];

我做错了什么?字符串是否存在语法问题?很抱歉,如果这个复杂的问题似乎离题了,但我真的非常感谢您的帮助,因为最近这变得非常令人沮丧。请参考上面关于JSON的链接,以帮助我解决这个问题。

您在一百万年内从未访问过类似的
JObject
属性。如果财产不存在怎么办?它将抛出异常。这就是你的情况。我运行了一个调试器,是的。它缺少值。您如何确保生成的日期时间实际上在其中?您至少可以尝试检查以下值-

var theObj = JObject.Parse(response.Content.ReadAsStringAsync().Result); //ignore this line, I used the default HttpClient, so the proper way to read as string.
                if (theObj.TryGetValue("Time Series (Daily)", out var theSeries)) //check if key exists
                {
                    if (((JObject) theSeries).TryGetValue(date.ToString("yyyy-MM-dd"), out var dateValue)) //check if key exists
                    {
                        var open = dateValue["1. open"];
                    }
                }

把那个怪物的表情分成几个小的子表情,看看它们。@DourHighArch。如果有任何内容为空,则是我的
JObject
,因为我已经调试并发现
date.ToString(“yyyy-MM-dd”)
确实返回了一个值。@MaxVoisard
JObject.Parse
是一个静态方法<代码>作业对象不能为空。检查
response
response.Content
是否为空。谢谢,它成功了。现在我觉得我的问题有点愚蠢,尽管我认为从
GetDatesBetween()
返回的每个日期都对应于Alpha Vantage的JSON中的一个日期。
TryGetValue()
的一个更简单的版本就是
if(value!=null)
,但我更喜欢您的实现。
var open = JObject.Parse(response.Content)["Time Series (Daily)"]["2020-01-10"]["1. open"];
var theObj = JObject.Parse(response.Content.ReadAsStringAsync().Result); //ignore this line, I used the default HttpClient, so the proper way to read as string.
                if (theObj.TryGetValue("Time Series (Daily)", out var theSeries)) //check if key exists
                {
                    if (((JObject) theSeries).TryGetValue(date.ToString("yyyy-MM-dd"), out var dateValue)) //check if key exists
                    {
                        var open = dateValue["1. open"];
                    }
                }