【问题标题】:Deserialize JSON to c# object将 JSON 反序列化为 c# 对象
【发布时间】:2015-08-05 07:16:38
【问题描述】:
{"facet_counts":{
  "facet_queries":{},
  "facet_fields":{},
  "facet_dates":{},
  "facet_ranges":{
    "createdat":{
      "counts":[
        "2015-05-17T00:00:00Z",155,
        "2015-05-18T00:00:00Z",162,
        "2015-05-19T00:00:00Z",200,
        "2015-05-20T00:00:00Z",218,
        "2015-05-21T00:00:00Z",181,
        "2015-05-22T00:00:00Z",137],
      "gap":"+1DAY",
      "start":"2015-05-17T00:00:00Z",
      "end":"2015-05-23T00:00:00Z"}}}}

我正在尝试将上述 json 反序列化到我的对象中,但计数部分没有被反序列化。我的对象是

public class FacetCounts
{
    public class Facet_Ranges
    {
        public class CreatedAt
        {
            public List<Counts> counts { get; set; }
            public class Counts
            {
                public Dictionary<string, int> count { get; set; }
            }
        }
        public CreatedAt createdat { get; set; }
    }
    public Facet_Ranges facet_ranges { get; set; }
}

我也尝试删除public Dictionary&lt;string, int&gt; count { get; set; },但仍然失败。 我的反序列化代码是

objObject = JsonConvert.DeserializeObject<FacetCounts>(json);

任何帮助将不胜感激!

【问题讨论】:

    标签: c# asp.net json deserialization json-deserialization


    【解决方案1】:

    您的 JSON 无效。 错误是完整的 JSon 字符串 {}

    周围缺少大括号

    这是一个有效的 JSon 字符串:

    {
    "facet_counts": {
        "facet_queries": {},
        "facet_fields": {},
        "facet_dates": {},
        "facet_ranges": {
            "createdat": {
                "counts": [
                    "2015-05-17T00:00:00Z",
                    155,
                    "2015-05-18T00:00:00Z",
                    162,
                    "2015-05-19T00:00:00Z",
                    200,
                    "2015-05-20T00:00:00Z",
                    218,
                    "2015-05-21T00:00:00Z",
                    181,
                    "2015-05-22T00:00:00Z",
                    137
                ],
                "gap": "+1DAY",
                "start": "2015-05-17T00:00:00Z",
                "end": "2015-05-23T00:00:00Z"
                }
            }
        }
    }
    

    我使用JSon Lint 来验证您的 JSON,并通过错误修复错误。
    我不确定你的 C# 代码是否正确反序列化你的 JSon,所以我建议你使用例如JSon2CSharp 以便在 C# 中创建您的 JSON 对象。然后你可以修复变量名等。

    【讨论】:

    • 显然在我吃早餐时有数百万条回复。
    • 非常感谢您的努力,我在 Json2Csharp 上验证了我的 JSON,它为我提供了正确的输出类。
    • 太棒了!没问题。 =)
    • 这是你的答案吗?如果是这样,请将其标记为答案。如果没有,您需要更多帮助吗? =)
    【解决方案2】:

    来自JSON2CSHARP

    public class Createdat
    {
        public List<object> counts { get; set; }
        public string gap { get; set; }
        public string start { get; set; }
        public string end { get; set; }
    }
    

    这对我有用

    【讨论】:

      【解决方案3】:
      public class FacetCounts
      {
          public class Facet_Ranges
          {
              public class CreatedAt
              {
                  public List<string> counts 
                  { 
                    get
                    {
                      return Counts
                        .SelectMany(pair => new[]{pair.Key, pair.Value.ToString()})
                        .ToList();
                    }
                    set
                    {
                      var pairs = new Dictionary<string, int>(); 
                      for (var i = 0; i < value.Length / 2; ++i)
                      {
                        pairs[value[2*i]] = int.Parse(value[2*i+1]);
                      }
                      this.Counts = pairs;
                    }
                  }
      
                  [JsonIgnore]
                  public Dictionary<string, int> Counts {get;set;}
              }
              public CreatedAt createdat { get; set; }
          }
          public Facet_Ranges facet_ranges { get; set; }
      }
      

      【讨论】:

      • 感谢您的努力,但我找到了一种更简单的方法。
      【解决方案4】:

      这不是有效的 json - 您的计数对象需要在 {braces} 中。

      仅供参考 - 您还可以使用 json2csharp.com 自动生成要反序列化的 c-sharp 对象,这也会突出显示此类问题。

      【讨论】:

      • 这是一个有效的 JSON,你提到的网站,我把我的代码放在那里,它给了我输出。感谢您的链接。
      【解决方案5】:

      {}包围每个项目

      "facet_counts":{
          "facet_queries":{},
          "facet_fields":{},
          "facet_dates":{},
          "facet_ranges":{
              "createdat":{
                  "counts":[
                      {"2015-05-17T00:00:00Z",155},
                      {"2015-05-18T00:00:00Z",162},
                      {"2015-05-19T00:00:00Z",200},
                      {"2015-05-20T00:00:00Z",218},
                      {"2015-05-21T00:00:00Z",181},
                      {"2015-05-22T00:00:00Z",137}],
              "gap":"+1DAY",
              "start":"2015-05-17T00:00:00Z",
              "end":"2015-05-23T00:00:00Z"}}}
      

      【讨论】:

      • 但是我从外部对象获取json,如何修改它的返回方式?
      • 你不能,但你应该把它放在问题中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多