• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

反序列化使用Newtonsoft和biding查看(MVVM)的JSON

c/c++ 3次浏览

我是C#和Xamarin的初学者。我想用newtonsoft反序列化json数组? 这里是我的JSON文件:反序列化使用Newtonsoft和biding查看(MVVM)的JSON

她是我的模型类:

当我尝试反序列化到一个列表它抛出异常此行:

错误是:

其他信息:不能反序列化当前JSON对象(例如{“name”:“value”})类型为’System.Collections.Generic.List`1 [System.Object]’,因为类型需要JSON数组(例如[1,2,3])才能正确地反序列化。

要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,以使其成为正常的.NET类型(例如,不是像整数这样的基本类型,不是像数组或List的集合类型),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中,以强制它从JSON对象反序列化。

此代码desirialize JSON的,但我现在不retrive数据并填充类:

我已经创造了一些代码MainViewModel,但我不知道如何检索数据并插入类别项目:

类RootItemViewModel:


===========解决方案如下:

1)你的JSON响应所示,它只是保持型RootObject的一个实例。

2)var data = JsonConvert.DeserializeObject<List<RootObject>>(json);不会工作,因此,因为您尝试投下RootObjectList<RootObject>。在错误响应中描述。

3)dynamic jsonDe = JsonConvert.DeserializeObject<RootObject>(json);将工作因为在这里你施放RootObjectRootObject。我也建议你涂用,而不是 “动态” 的 “变种”(明白为什么:dynamic vs var)

4)你下面的方法似乎有没有搞错:

private async void LoadData() 
{ 
    var emps = new RootObject(); 

    emps = await apiServices.GetRootObject(); 

    RootObjects.Clear(); 

    //Mistake: 
    //You iterate through the previously cleared observable collection. 
    //it really should be "foreach (var item in emps.Items)" 
    foreach (var item in RootObjects) 
    { 

     RootObjects.Add(new RootItemViewModel 
     { 


     }); 
    } 
} 

5)它看起来像你想与Item类型的数组养活观察集合你的RootObject

public class RootObject 
    { 
     [JsonProperty("items")] 
     public Item[] Items { get; set; } //This property 

     [JsonProperty("next")] 
     public Next Next { get; set; } 
    } 

那么你实际上应该做的是设置这样的数据:

private async void GetRootObjectItems() 
     { 
      RootObject emps = await apiServices.GetRootObject(); //Get the root object 
      RootObjects.Clear();      //clear the list 

      foreach (var item in emps.Items) //Important, to get the data from the Array on the RootObject 
      { 
       ///its a nice way to give your viewmodel a ctor signature that ensures a correct initialization 
       ///public RootItemViewModel(Item item) 
       ///{ 
       /// this.Deptno = item.Deptno; 
       ///} 
       RootObjects.Add(new RootItemViewModel(item)); 
      } 
     } 
    } 

6)这是没有意义的你RootItemViewModelRootObject继承。你应该让它从Item继承或拥有Item类型的财产。

我希望我能清理一下!


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)