【问题标题】:How to Parse Json from UrI to list on Xamarin Android如何从 UrI 解析 Json 以在 Xamarin Android 上列出
【发布时间】:2017-04-19 20:17:04
【问题描述】:

我尝试了太多但没有成功

这是我从 Web 服务 Uri 获取 JSON 字符串并将其反序列化为列表的方法,我想在 Xamarin Android App 上使用它

public async void DownloadDataAsync()
    {
        string url = "http://myWebSite.com/jWebService.asmx/GetOffersJSON?storeID=2";
        var httpClient = new HttpClient();
        Task <string> downloadTask = httpClient.GetStringAsync(url);
        string content = await downloadTask;

        // de-serializing json response into list
        JObject jsonResponse = JObject.Parse(content);
        IList<JToken> results = jsonResponse["offs"].ToList();
        foreach (JToken token in results)
        {
            offers poi = JsonConvert.DeserializeObject<offers>(token.ToString());
            offs.Add(poi);
        }
    }

当我调用 DownloadDataAsync();我收到一个错误:

发生未处理的异常。

解决办法是什么?

我的网络服务方法上有参数,我可以处理它吗?

这是我的 JSON Uri 结果:

This XML file does not appear to have any style information associated with 
it. The document tree is shown below.
<string xmlns="http://tempuri.org/">[{"ItemID":20,"ItemBarcode":"111","ItemName":"hgh","ItemImage":"MegaOrders22017-04-14-08-34-27.jpg","ItemPrice":7.0000,"ItemNotes":"gffgdfj","OfferOn":true},{"ItemID":21,"ItemBarcode":"222","ItemName":"Nod","ItemImage":"MegaOrders22017-04-14-08-34-57.jpg","ItemPrice":4.0000,"ItemNotes":"kkkkkk","OfferOn":true},{"ItemID":22,"ItemBarcode":"333","ItemName":"kjkjkjkj","ItemImage":"MegaOrders22017-04-14-08-35-21.jpg","ItemPrice":6.0000,"ItemNotes":"hhhhggggg","OfferOn":true},{"ItemID":23,"ItemBarcode":"4444","ItemName":"oioioio","ItemImage":"MegaOrders22017-04-14-08-35-50.jpg","ItemPrice":5.0000,"ItemNotes":"hjhgfdfghj","OfferOn":true}]
</string>

我使用的类:

public class offers
{
    public int ItemID { get; set; }
    public string ItemBarcode { get; set; }
    public string ItemName { get; set; }
    public string ItemImage { get; set; }
    public double ItemPrice { get; set; }
    public string ItemNotes { get; set; }
    public bool OfferOn { get; set; }
}

【问题讨论】:

  • 错误应该有更多细节,比如你的方法失败的堆栈跟踪。
  • 不幸的是,我只出现了这个错误文本,你能告诉我代码是否正确吗?

标签: c# json web-services xamarin.android


【解决方案1】:

请试试这个:

 public async void DownloadDataAsync()
    {
        try
        {
            string url = "http://myWebSite.com/jWebService.asmx/GetOffersJSON?storeID=2";
            var httpClient = new HttpClient();
            var content = await httpClient.GetStringAsync(url);

            // de-serializing json response into list, with filtering before
            var startPosition = content.IndexOf('>') + 1;
            var endPosition = content.LastIndexOf("</", StringComparison.Ordinal);
            var filteredResponseCharArray = new char[endPosition - startPosition];
            content.CopyTo(startPosition, filteredResponseCharArray, 0, endPosition - startPosition);
            var listOfOffers = JsonConvert.DeserializeObject<List<offers>>(new string(filteredResponseCharArray));
        }
        catch (Exception error)
        {
            Debug.WriteLine(error);
            throw;
        }
    }

您应该更改您的 Web 服务以获得没有 XML 结构的有效 JSON 响应。

【讨论】:

  • 我使用 try-catch 作为您的示例代码,但同样的错误,我担心调用该方法时会发生错误,这是我的调用:private void BtnDownload_Click(object sender, System.EventArgs { DownloadDataAsync( ); }
  • 您的 JSON 响应看起来很奇怪。您的响应有一个 XML 标头,但有一个 JSON 正文。我认为,您首先应该在您的 Web 服务中更改它。如果您完成了,您不必在您的 xamarin 应用程序中过滤您的响应。我很确定,异常是由 JsonConvert 引发的,因为您错误地过滤了您的响应。
  • 感谢 Sean Stayn 的反应,我评论了所有代码,只保留前三行,当我评论这一行时 [var content = await httpClient.GetStringAsync(url);] 没有错误但是当我返回它时,错误再次出现,我厌倦了这个错误,我想要解决方案
  • 您确定您的网址正确吗?您可以尝试使用 WebClient 而不是 HttpClient: var webClient = new WebClient(); var response = webClient.DownloadString(url);
  • 我写这行时出现同样的错误 [var response = webClient.DownloadString(url);] 我认为该错误与Internet连接有关,我该如何发送给您请项目来解决这个问题,因为这对我来说非常必要。
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
相关资源
最近更新 更多