无法反序列化当前的JSON对象(例如{“name”:“value”})

时间:2015-06-18 13:06:26

标签: c# json serialization xamarin xamarin.forms

请帮帮我,我是xamarin.forms的新手,C#我已经尝试了stackoverflow中给出的所有解决方案,但无法解决

 using (var httpClient = new HttpClient())
 {
   var response = httpClient.GetAsync(Url).Result;
   if (response.IsSuccessStatusCode)
   {
      var responseContent = response.Content;
      string contents = await responseContent.ReadAsStringAsync();
      List<abcModel> tm = JsonConvert.DeserializeObject<List<abcModel>>(contents);
      abcMaster = new ObservableCollection<SummaryModel>();
      var c = tm[0].SSum.Count();
   }
} 

模型

public class abcModel
{
  public List<SSum> SSum { get; set; }
}
public class SSum
{
  public string Name{ get; set; }
}

我的Json

{"a":[{"SSum":[{"Name":"Earth"}]}]}

错误: -

  

无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1 [abcModel]',因为该类型需要JSON数组(例如[1,2] ,3])正确反序列化。   要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。

3 个答案:

答案 0 :(得分:3)

因为你显然只想反序列化json的嵌套部分,所以这样做:

var result = JsonConvert.DeserializeObject<Dictionary<string, List<abcModel>>>(json);

答案 1 :(得分:0)

您错过了JSON中的a属性。您可以反序列化为具有该属性的类:

public class MyType
{
    public List<abcModel> A { get; set; }
}

JsonConvert.DeserializeObject<MyType>(json);

或者一起跳过该属性(@stefankmitph的回答很有效),这是另一种选择:

JObject obj = JObject.Parse(json);

List<abcModel> model = obj["a"].ToObject<List<abcModel>>();

请注意:通常C#类是PascalCased

答案 2 :(得分:0)

如果您已经拥有JSON字符串,则应使用json2csharp之类的生成器来创建响应DTO。这样可以防止集合与单个对象的错误。

public class SSum
{
    public string Name { get; set; }
}

public class A
{
    public List<SSum> SSum { get; set; }
}

public class RootObject
{
    public List<A> A { get; set; }
}

现在您可以反序列化整个对象:

tm = JsonConvert.DeserializeObject<RootObject>(contents);