我似乎在从网站解析此JSON数据时遇到问题。这是指向JSON的链接-GITHUB。我不是要从Github中获取信息,这只是一个包含请求标头和请求正文的副本。
这是我的Get方法:
public void Get(string url, WebHeaderCollection collection = null)
{
try
{
var webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = "GET";
webRequest.UserAgent = User_Agent;
webRequest.ContentType = "application/json";
webRequest.AllowAutoRedirect = false;
if (collection != null)
{
for (int i = 0; i < collection.Count; i++)
{
webRequest.Headers.Add(collection.Keys[i], collection.Get(i));
}
}
var webResponse = (HttpWebResponse)webRequest.GetResponse();
WebHeaderCollection HeaderCollection = webResponse.Headers;
this.ResponseStream = webResponse.GetResponseStream();
using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
var response = reader.ReadToEnd();
this.Status = (int)webResponse.StatusCode;
this.Response = response;
this.HeaderCollection = HeaderCollection;
}
}
catch (WebException e)
{
this.Status = (int)e.Status;
this.Response = $"{new StreamReader(e.Response.GetResponseStream()).ReadToEnd()}";
}
// WriteLog("get", "request_logs.txt", url, Response, HeaderCollection);
}
这是我当前遇到的代码:
public List<Item> RetrieveAllRealmItems(string realm, string region)
{
string regionID = region.ToUpper();
string realmID = realm.Replace(" ", "-").ToLower();
Request request = new Request(User_Agent);
request.Get($"{API_URL}item/{regionID}/{realmID}?format=json&apikey={API_Key}");
JArray itemArray = JArray.Parse(request.Response);
List<Item> RealmItems = new List<Item>();
foreach(JObject item in itemArray)
{
Item newItem = new Item(item);
RealmItems.Add(newItem);
}
return RealmItems;
}
这是Item.cs:
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TSMCSharp
{
public class Item
{
public int ID { get; internal set; }
public string Name { get; internal set; }
public int Level { get; internal set; }
public string Class { get; internal set; }
public string SubClass { get; internal set; }
public int BuyPrice { get; internal set; }
public int SellPrice { get; internal set; }
public int MarketValue { get; internal set; }
public int MinimumBuyoutPrice { get; internal set; }
public int Quantity { get; internal set; }
public int NumberOfAuctions { get; internal set; }
public int HistoricalPrice { get; internal set; }
public int AverageRegionMarketPrice { get; internal set; }
public int AverageRegionMinimumBuyoutPrice { get; internal set; }
public int RegionQuantity { get; internal set; }
public int RegionHistoricalPrice { get; internal set; }
public int AverageRegionSaleRate { get; internal set; }
public int AverageRegionDailySold { get; internal set; }
public int RegionSaleRate { get; internal set; }
public string URL { get; internal set; }
public long LastUpdated { get; internal set; }
#region EU
public int AverageEUMarketValue { get; internal set; }
public int AverageEUMinimumBuyout { get; internal set; }
public int EUQuantity { get; internal set; }
public int EUHistoricalPrice { get; internal set; }
public int AverageEUSaleRate { get; internal set; }
public int AverageEUDailySold { get; internal set; }
public long EULastModified { get; internal set; }
#endregion
#region US
public int AverageUSMarketValue { get; internal set; }
public int AverageUSMinimumBuyout { get; internal set; }
public int USQuantity { get; internal set; }
public int USHistoricalPrice { get; internal set; }
public int AverageUSSaleRate { get; internal set; }
public int AverageUSDailySold { get; internal set; }
public long USLastModified { get; internal set; }
#endregion
public Item(JObject rawData)
{
if (rawData["Id"] != null)
ID = int.Parse(rawData["Id"].ToString());
if (rawData["ItemId"] != null)
ID = int.Parse(rawData["ItemId"].ToString());
if (rawData["Name"] != null)
Name = rawData["Name"].ToString();
if (rawData["Level"] != null)
Level = int.Parse(rawData["Level"].ToString());
if (rawData["Class"] != null)
Class = rawData["Class"].ToString();
if (rawData["SubClass"] != null)
SubClass = rawData["SubClass"].ToString();
if (rawData["VendorBuy"] != null)
BuyPrice = int.Parse(rawData["VendorBuy"].ToString());
if (rawData["VendorSell"] != null)
SellPrice = int.Parse(rawData["VendorSell"].ToString());
if (rawData["MarketValue"] != null)
MarketValue = int.Parse(rawData["MarketValue"].ToString());
if (rawData["MinBuyout"] != null)
MinimumBuyoutPrice = int.Parse(rawData["MinBuyout"].ToString());
if (rawData["Quantity"] != null)
Quantity = int.Parse(rawData["Quantity"].ToString());
if (rawData["NumAuctions"] != null)
NumberOfAuctions = int.Parse(rawData["NumAuctions"].ToString());
if (rawData["HistoricalPrice"] != null)
HistoricalPrice = int.Parse(rawData["HistoricalPrice"].ToString());
if (rawData["RegionMarketAvg"] != null)
AverageRegionMarketPrice = int.Parse(rawData["RegionMarketAvg"].ToString());
if (rawData["RegionMinBuyoutAvg"] != null)
AverageRegionMinimumBuyoutPrice = int.Parse(rawData["RegionMinBuyoutAvg"].ToString());
if (rawData["RegionQuantity"] != null)
RegionQuantity = int.Parse(rawData["RegionQuantity"].ToString());
if (rawData["RegionHistoricalPrice"] != null)
RegionHistoricalPrice = int.Parse(rawData["RegionHistoricalPrice"].ToString());
if (rawData["RegionSaleAvg"] != null)
AverageRegionSaleRate = int.Parse(rawData["RegionSaleAvg"].ToString());
if (rawData["RegionAvgDailySold"] != null)
AverageRegionDailySold = int.Parse(rawData["RegionAvgDailySold"].ToString());
if (rawData["RegionSaleRate"] != null)
RegionSaleRate = int.Parse(rawData["RegionSaleRate"].ToString());
if (rawData["URL"] != null)
URL = rawData["URL"].ToString();
if (rawData["LastUpdated"] != null)
LastUpdated = long.Parse(rawData["LastUpdated"].ToString());
#region EU
if (rawData["EUMarketAvg"] != null)
AverageEUMarketValue = int.Parse(rawData["EUMarketAvg"].ToString());
if (rawData["EUMinBuyoutAvg"] != null)
AverageEUMinimumBuyout = int.Parse(rawData["EUMinBuyoutAvg"].ToString());
if (rawData["EUQuantity"] != null)
EUQuantity = int.Parse(rawData["EUQuantity"].ToString());
if (rawData["EUHistoricalPrice"] != null)
EUHistoricalPrice = int.Parse(rawData["EUHistoricalPrice"].ToString());
if (rawData["EUSaleAvg"] != null)
AverageEUSaleRate = int.Parse(rawData["EUSaleAvg"].ToString());
if (rawData["EUAvgDailySold"] != null)
AverageEUDailySold = int.Parse(rawData["EUAvgDailySold"].ToString());
if (rawData["EULastModified"] != null)
EULastModified = long.Parse(rawData["EULastModified"].ToString());
#endregion
#region US
if (rawData["USMarketAvg"] != null)
AverageUSMarketValue = int.Parse(rawData["USMarketAvg"].ToString());
if (rawData["USMinBuyoutAvg"] != null)
AverageUSMinimumBuyout = int.Parse(rawData["USMinBuyoutAvg"].ToString());
if (rawData["USQuantity"] != null)
USQuantity = int.Parse(rawData["USQuantity"].ToString());
if (rawData["USHistoricalPrice"] != null)
USHistoricalPrice = int.Parse(rawData["USHistoricalPrice"].ToString());
if (rawData["USSaleAvg"] != null)
AverageUSSaleRate = int.Parse(rawData["USSaleAvg"].ToString());
if (rawData["USAvgDailySold"] != null)
AverageUSDailySold = int.Parse(rawData["USAvgDailySold"].ToString());
if (rawData["USLastModified"] != null)
USLastModified = long.Parse(rawData["USLastModified"].ToString());
#endregion
}
}
}
这是确切的错误:
Newtonsoft.Json.JsonReaderException:'从JsonReader读取JArray时出错。当前JsonReader项不是数组:StartObject。路径”,第1行,位置1。'
但是,据我所知,链接的JSON中的Response Body是一个包含JObjects的JArray,用方括号表示。
更新-
因此我将JSON解析为JToken,然后通过它传递了GetType()方法。显然这是一个JObject,所以我想我的下一个问题是,如何从没有密钥的JObject中检索信息?