【问题标题】:Android - JSON Parsing throws unexpected character exceptionAndroid - JSON Parsing 抛出意外的字符异常
【发布时间】:2018-11-18 13:13:44
【问题描述】:

我正在开发一个 android c# 应用程序,它从特定的 url 获取价格(JSON 格式),然后解析它以获取价格。我尝试了多种方法来做到这一点,但每种方法都会抛出一个特定的异常。这是我最近的一个:

public string getprice()
    {
        HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create("https://api.cryptonator.com/api/ticker/etc-usd");
        webReq.CookieContainer = new CookieContainer();
        webReq.Method = "GET";
        using (WebResponse response = webReq.GetResponse())
        {
            using (Stream stream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(stream);
                var array = JsonValue.Parse(reader.ReadToEnd());
                string price = array["ticker"]["price"].ToString();
                return price;
            }
        }
    }

所以,有时它工作正常,有时它会抛出这个异常

system.argumentexception:第 1 行第 0 列出现意外字符“

它已经对我的应用程序进行了 19 次调试以对其进行测试,前 15 次运行良好,之后每次执行时都会抛出上述错误。我不知道为什么会这样。你能帮帮我吗?

编辑

按照@Fenton 的建议,我使用 Fiddler 检查原始请求。 这是我得到的

【问题讨论】:

  • 您多久访问一次 API?您是否有可能受到限制,并且当您超过允许的速率时,他们会向您发送错误而不是 JSON?你的代码对我来说很好,我从来没有出错。这是我用来执行代码的小提琴:dotnetfiddle.net/oceuPV
  • @Rainbolt 我在 foreach 循环中调用了 getprice() 函数 10 次。但是函数 getprice() 很好,它只是在 25% 的尝试中抛出了这个异常。你有什么建议 ?我不介意用新功能替换它,我只想毫无例外地获得价格。
  • 我们需要看到异常抛出时的响应。如果它在 75% 的时间内都在工作,并且您在 fiddler 中捕获响应并将其展示给我们,那么您很可能捕获了一个很好的响应。我们需要一个糟糕的回应。编辑您的代码以使用 try catch 并在捕获到异常时记录响应。
  • @Rainbolt 好的,我编辑了我的代码并添加了trycatch,这是运行时抛出的异常,我通过 Toast 消息捕获它:system.argumentexception: unexpected character '<' at line 1 column 0

标签: c# android json parsing exception


【解决方案1】:

此问题的最可能原因是响应实际上不是 JSON。

这里的线索是<

造成这种情况的两个常见原因是:

  • 你调用的web API有错误,错误页面是HTML(故以<开头)
  • Web API 可以返回不同的数据格式,并向您发送 XML(检查您的接受标头,并且 API 尊重它)。

检查原始请求(例如使用 Fiddler)以查看实际响应 - 或在调试模式下查看原始响应。

【讨论】:

  • 我已经下载了 fiddler 并检查了网站的响应,我在我的问题中添加了结果的屏幕截图。我没有发现任何可疑的东西
  • 我可以在这里做一个游戏并告诉应用程序,如果它发现像< 这样的意外字符将其删除并继续解析?因为它并不总是得到这个意外字符,所以函数 getprice 工作正常,它只是在所有尝试的 25% 左右抛出这个异常。
  • @Wassim01 如果 API 提供 HTTP 状态代码,则使用它来确定成功,而不是使用响应。如果失败,请重试(理想情况下会出现指数级延迟、抖动重试),直到获得成功响应。
猜你喜欢
  • 2018-03-04
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多