【问题标题】:Cannot deserialize the current JSON object (e.g. {"name":"value"})无法反序列化当前 JSON 对象(例如 {"name":"value"})
【发布时间】:2015-06-18 13:06:26
【问题描述】:

请帮帮我,我是 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; }
}

我的杰森

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

错误:-

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

【问题讨论】:

    标签: c# json serialization xamarin xamarin.forms


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试计算 SSum 部分中 json 中存在的总值如何获得
    • 不清楚你在问什么...总结一下? var sum = result["a"].Sum(x =&gt; x.SSum.Count);?
    【解决方案2】:

    您的 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

    【讨论】:

    • 我尝试计算 SSum 部分中 json 中存在的总值如何获得
    • @AtulDhanuka:我不太确定你在问什么——你在找tm.Sum(i =&gt; i.SSum.Count)吗?
    • 你的 tm 总数
    【解决方案3】:

    如果您已经有了 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);
    

    【讨论】:

      猜你喜欢
      • 2016-02-05
      • 2021-12-27
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      相关资源
      最近更新 更多