【问题标题】:Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:StartArray。路径'',第 1 行,位置 1
【发布时间】:2020-04-24 13:43:20
【问题描述】:

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);

错误信息:

从 JsonReader 读取 JObject 时出错。当前的 JsonReader 项目不是 一个对象:StartArray。路径'',第 1 行,位置 1。

问题是什么?我该如何解决?



编辑:
这是 reader_str :https://pastebin.com/fyv7GPVH

【问题讨论】:

  • 你能分享一些关于 reader_str 的信息吗?
  • 这里是 reader_str :pastebin.com/fyv7GPVH
  • 您也可以在 Firefox 中打开该网址 - 您会看到该 json 没有问题。怎么了?
  • 结果没问题,我认为它的原因是您试图将数组解析为对象。
  • 只要找到我提到的使用作业或对象两种方式的解决方案。希望对你有帮助

标签: c# json json.net


【解决方案1】:

您收到的 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(",", "");

【讨论】:

  • 嗨,我遇到了与问题中描述的相同的问题(具有数组的 json 字符串)并且您的回答有所帮助 -> 我有一个 JObject 列表并遍历了列表中的每个对象。但是,如果一个键的值作为对象,因为我想访问该嵌套键的值,该怎么做?将不胜感激任何见解
  • @Chahat 你能发送你的 JSON 和你想要的属性吗?
  • 我刚刚找到了解决方案。对于像 { "abc" : { "name" : "Chahat" }) -> 这样的嵌套键来提取 "name value" ,我只是使用了 obj[ “abc.name”] 。不过谢谢你
猜你喜欢
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2022-11-27
  • 1970-01-01
  • 2017-04-08
相关资源
最近更新 更多