【问题标题】:c# Cannot deserialize the current JSON objectc#无法反序列化当前JSON对象
【发布时间】:2017-09-27 07:29:48
【问题描述】:

尝试从 ThingSpeak 获取 JSON 数据,但出现上述错误, 使用 JSON 占位符作为 URL 效果很好。

这是我的主要cs代码:

namespace Drip
{
    public class Feed
    {
        public DateTime Created_at { get; set; }
        public int Entry_id { get; set; }
        public string Field1 { get; set; }
    }

    public partial class DripPage : TabbedPage
    {
        private const string Url = "https://thingspeak.com/channels/301726/field/1.json";
        private HttpClient _client = new HttpClient();
        private ObservableCollection<Feed> _data;

        public DripPage()
        {
            InitializeComponent();
        }

        protected override async void OnAppearing()
        {
            var content = await _client.GetStringAsync(Url);
            var data = JsonConvert.DeserializeObject<List<Feed>>(content);

            _data = new ObservableCollection<Feed>(data);
            postsListView.ItemsSource = _data;
            base.OnAppearing();
        }

这是我的 JSON:

{
  "channel": {
    "id": 301726,
    "name": "Testing ESP8266",
    "description": "Water meter pulse count",
    "latitude": "0.0",
    "longitude": "0.0",
    "field1": "Water Pulse",
    "created_at": "2017-07-12T12:19:38Z",
    "updated_at": "2017-09-26T08:41:17Z",
    "elevation": "54",
    "last_entry_id": 151
  },
  "feeds": [
    {
      "created_at": "2017-08-15T13:14:28Z",
      "entry_id": 52,
      "field1": "13.00\r\n\r\n"
    },
    {
      "created_at": "2017-08-15T13:14:44Z",
      "entry_id": 53,
      "field1": "13.00\r\n\r\n"
    },
    {
      "created_at": "2017-08-15T13:14:59Z",
      "entry_id": 54,
      "field1": "13.00\r\n\r\n"
    }
  ]
}

【问题讨论】:

  • 对不起,为什么要把这个问题标记为C

标签: c# android c json xamarin


【解决方案1】:

返回的json不是数组,所以不能反序列化为List&lt;Feed&gt;,所以会抛出异常。它是一个对象,该对象的成员之一是您感兴趣的数组。要反序列化的支持 C# 类应具有以下成员:

public class RootObject
{
    public Channel channel { get; set; }
    public List<Feed> feeds { get; set; }
}

public class Channel
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public string latitude { get; set; }
    public string longitude { get; set; }
    public string field1 { get; set; }
    public DateTime created_at { get; set; }
    public DateTime updated_at { get; set; }
    public string elevation { get; set; }
    public int last_entry_id { get; set; }
}

public class Feed
{
    public DateTime created_at { get; set; }
    public int entry_id { get; set; }
    public string field1 { get; set; }
}

您可以反序列化为RootObject(或您选择的任何名称),而不是反序列化为List&lt;Feed&gt;

var data = JsonConvert.DeserializeObject<RootObject>(content);
_data = new ObservableCollection<Feed>(data.feeds);

【讨论】:

    【解决方案2】:

    试试这个,也许它对你有用 首先:将此代码放在您的活动上并实例化所有var;您将创建一个javalist来反序列化您的json,然后您将使用webclient方法获取您的json,然后您将使用runonuithread方法在后台执行进程。

    articles = new JavaList<RootObject>();
            mWebClient = new WebClient();
            mUrl = new Uri(urlAddress);
            mWebClient.DownloadDataAsync("https://thingspeak.com/channels/301726/field/1.json");
            mWebClient.DownloadDataCompleted += MWebClient_DownloadDataCompleted;
    

    第二个:mWebClient.DownloadDataCompleted 方法会生成这个:

    private void MWebClient_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
        {
            RunOnUiThread(() =>
            {
                try
                {
                    string json = Encoding.UTF8.GetString(e.Result);
                    articles = JsonConvert.DeserializeObject<JavaList<RootObject>>(json);
                    mAdapter = new ArticleAdapterCostum(this, articles);
                    mListView.Adapter = mAdapter;
                }
                catch (Exception exception)
                {
                    Toast.MakeText(this, " Vueillez verifier votre connexion a internet puis reessayer ", ToastLength.Short).Show();
                }
            });
        }
    

    不要忘记为您的列表视图创建一个服装适配器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2017-03-06
      • 2017-10-28
      相关资源
      最近更新 更多