Ошибка чтения JObject из JsonReader. Текущий элемент JsonReader не является объектом: StartArray. Путь '', строка 1, позиция 1 - PullRequest
1 голос
/ 24 апреля 2020

C# коды:

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace BTC_Changex
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            double bitcoin_price_dollar = bitcoin_price_method();
        }

        public static double bitcoin_price_method()
        {
            double bitcoin_price = 8500;

            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd");
                req.Method = "GET";
                req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8";
                req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
                req.ContentType = "text/html; charset=utf-8";
                req.Referer = "";
                req.KeepAlive = true;
                req.Timeout = 25000;
                req.AllowAutoRedirect = true;

                CookieContainer cookieJar1 = new CookieContainer();
                req.CookieContainer = cookieJar1;

                HttpWebResponse res = (HttpWebResponse)req.GetResponse();

                foreach (Cookie cookie in res.Cookies)
                {
                    cookieJar1.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), "/", cookie.Domain));
                }

                Stream Stream = res.GetResponseStream();
                StreamReader reader = new StreamReader(Stream);
                string reader_str = reader.ReadToEnd();

                var obj = JObject.Parse(reader_str);
                string bitcoin_price_str = ((string)obj["0"]["current_price"]).Trim().Replace(",", "");
                bitcoin_price = double.Parse(bitcoin_price_str);

                reader.Close();
                Stream.Close();
                res.Close();
            }
            catch (Exception ex)
            {

            }

            return bitcoin_price;
        }
    }
}

У меня есть ошибка в этой строке: var obj = JObject.Parse(reader_str);

Сообщение об ошибке:

Ошибка чтения JObject из JsonReader , Текущий элемент JsonReader не является объектом: StartArray. Путь '', строка 1, позиция 1.

В чем проблема и как я могу ее исправить?



Редактировать:
Вот здесь reader_str: https://pastebin.com/fyv7GPVH

1 Ответ

1 голос
/ 24 апреля 2020

JSON, который вы получаете, является массивом объектов, и вы не можете преобразовать его в объект.

 var objs = JArray.Parse(reader_str).ToObject<List<object>>();
 string bitcoin_price_str = ((string)((objs[0] as JObject)["current_price"])).Trim().Replace(",", "");

По умолчанию JArray содержит список пар ключевых значений рабочих мест, которым вы можете назначить их c# объекты. Также я предлагаю вам использовать JObject вместо объектов и, преобразовав в строку, мы получаем доступ к строковому индексу, а не к объекту.

var objs = JArray.Parse(reader_str).ToObject<List<JObject>>();
string bitcoin_price_str = objs[0]["current_price"].ToString().Trim().Replace(",", "");
//or
var objs = JArray.Parse(reader_str).ToObject<List<JObject>>();
string bitcoin_price_str2 = objs[0].GetValue("current_price").ToString().Trim().Replace(",", "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...