2017-11-25 157 views
1

我试图挽救两个变量进行JSON请求,但我只是想拿到第一个工作,这是我的要求:.NET API无法找到数据我想

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.majestic.com/api/json?app_api_key=KEY&cmd=GetIndexItemInfo&items=1&item0=http://www.majestic.com&datasource=fresh"); 
    { 
    WebResponse response = request.GetResponse(); 
    using (Stream responseStream = response.GetResponseStream()) 
     { 
      StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
      JObject jObject = JObject.Parse(reader.ReadToEnd()); 
      JToken Trusty = jObject["DataTables"]["Results"]["Data"][2]; 
      var newdomain = new Identifier { domain = model.domain, contact = model.contact, contactname = model.contactname, price = model.price, type = model.type, TrustFlow = Int32.Parse(Trusty.ToString()), CitationFlow = 65, RI = model.RI, MJTopicsID = model.MJTopicsID, UserTableID = model.UserTableID }; 
      ViewBag.newdomain = newdomain; 
      db.Identifiers.Add(newdomain); 

这将返回该错误:

System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection.'

我也试过

Token Trusty = jObject["DataTables"]["Results"]["Data"]["TrustFlow"][0]; 

这将返回:

'Accessed JArray values with invalid key value: "TrustFlow". Int32 array index expected.'

这是我试过的JSON分离它自己作为它刚刚作为一个长线的网址:

{ 
"Code":"OK","ErrorMessage":"","FullError":"","FirstBackLinkDate":"2017-08-17","IndexBuildDate":"2017-11-20 10:51:56","IndexType":1,"MostRecentBackLinkDate":"2017-11-18","QueriedRootDomains":0,"QueriedSubDomains":0,"QueriedURLs":1,"QueriedURLsMayExist":0,"ServerBuild":"2017-10-25 14:33:44","ServerName":"QUACKYO","ServerVersion":"1.0.6507.24412","UniqueIndexID":"20171120105156-FRESH", 
"DataTables":{ 
    "Results":{ 
     "Headers":{ 
"MaxTopicsRootDomain":30,"MaxTopicsSubDomain":20,"MaxTopicsURL":10,"TopicsCount":3 
    }, 
     "Data":[{ 
"RefDomainTypeProtocolHTTPS":"228","CitationFlow":42,"TrustFlow":29,"TrustMetric":29,"TopicalTrustFlow_Topic_0":"Health/Animal","TopicalTrustFlow_Value_0":26,"TopicalTrustFlow_Topic_1":"Business","TopicalTrustFlow_Value_1":25,"TopicalTrustFlow_Topic_2":"Computers/Internet/Domain Names","TopicalTrustFlow_Value_2":24 
    } 
]}}} 

我在做什么错?谢谢。

+0

您的“数据”数组中只有一个元素,并且您要求[3]中的第三个元素。您尝试的另一件事是请求Trustflow数组的第一个元素,但Trustflow不是数组。在第二次尝试时放下[0]? –

+0

数组基于0索引。因此,您将以“someArray [0]' – Shyju

+0

@MarcTalbot的形式访问第一个项目,它会返回相同的错误'带有无效键值的访问JArray值:”TrustFlow“。 Int32数组索引预期。'对不起,我打算说,当我说它返回Int32它返回它在上一级,我会编辑 – liamcook

回答

2

您的Data属性是一个大小为1的数组。数组基于0索引。所以,你要访问的第一个项目为someArray[0]和第二项为someArray[1]

读取存储数据数组中的第一个项目的TrustFlow属性内的int值,你可以这样做

int trustFlow = jObject["DataTables"]["Results"]["Data"][0]["TrustFlow"].Value<int>(); 

这应该适用于您在问题中提供的JSON数据。请记住,该代码预计数据将在该结构中。例如,如果您的Data阵列没有任何项目,或者您的Results没有Data属性,则代码将崩溃(可能是空引用异常)。您可以在尝试根据需要访问该值之前自行添加空检查。

+1

作品梦想!谢谢!还没有任何阵列的经验,但真的清除了我,以及使它的工作:)谢谢! – liamcook

相关问题