Newtonsoft.Json.JsonReaderException:'从JsonReader读取JArray时出错。当前JsonReader项不是数组

时间:2018-08-06 13:54:52

标签: c# json

我似乎在从网站解析此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中检索信息?

0 个答案:

没有答案