【问题标题】:JSON to Dictionary c#JSON到字典c#
【发布时间】:2016-10-10 15:43:23
【问题描述】:
[
  {
    "CRMNextFields": [
      {
        "FieldName": "ActiveTime",
        "CastRequired": "False",
        "DefaultValue": "",
        "Description": "",
        "FieldID": "10001567",
        "KeyID": "6",
        "Label": "SN_ActiveTime",
        "IsMandatory": "False",
        "MaxValue": "",
        "MinValue": "",
        "Type": "1",
        "IsLookup": "False",
        "LinkedFields": "",
        "FieldKey": "0",
        "TextFieldName": "",
        "ErrorMessage": "",
        "LayoutFieldId": "",
        "LayoutType": "0",
        "IsDNC": "",
        "DNCField": "",
        "ReturnType": "-1"
      },
      {
        "FieldName": "CreatedByTypeName",
        "CastRequired": "False",
        "DefaultValue": "",
        "Description": "",
        "FieldID": "10001601",
        "KeyID": "6",
        "Label": "SN_CreatedByType",
        "IsMandatory": "False",
        "MaxValue": "",
        "MinValue": "",
        "Type": "2",
        "IsLookup": "True",
        "LinkedFields": "",
        "FieldKey": "257",
        "TextFieldName": "",
        "ErrorMessage": "",
        "LayoutFieldId": "",
        "LayoutType": "-1",
        "IsDNC": "",
        "DNCField": "",
        "ReturnType": "-1"
      }
    ]
  }
]

我想将此 JSON 转换为字典。 但我在转换时遇到了一些异常。

Dictionary<object, object> values = JsonConvert.DeserializeObject<Dictionary<object, object>>(jsonResp);

错误:

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“System.Collections.Generic.Dictionary`2[System.Object,System.Object]”,因为该类型需要 JSON 对象(例如{"name":"value"}) 正确反序列化。

要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化的列表。也可以将 JsonArrayAttribute 添加到类型中以强制它从 JSON 数组中反序列化。

路径'',第 1 行,位置 1。

【问题讨论】:

  • 尝试Dictionary&lt;string, object&gt; 进行反序列化。但是,您似乎拥有比字典更大的对象,即包含具有字典样式格式的对象的数组。您可以创建一个可以使用里面的字典反序列化它的类

标签: c# json dictionary


【解决方案1】:

这个 JSON 似乎没有描述字典。相反,它似乎描述了一个包含一个字典的字典列表,其键是“CRMNextFields”,其值是另一个字典列表。

因此,反序列化成这个作品:

var data = JsonConvert
.DeserializeObject<List<Dictionary<string, List<Dictionary<string,object>>>>>
(/*your json*/);

并像这样访问内部字典:

var crmFields = data.First()["CRMNextFields"];
foreach (Dictionary<string,object> crmField in crmFields)
{
    foreach (var innerProperty in crmField)
    {
        // this will iterate the innermost fields.
    }
}

您应该能够直观地跟踪此逻辑。最外面的容器是一个 [],所以你知道它是一个 JSON 数组,而不是一个 JSON 对象。该数组的成员是 {},因此它是一个对象(即在 C# 中可转换为 Dictionary),并且该对象具有一个带有键和值的属性,该属性又是一个 [] 数组,因此您将继续关注同样的逻辑。

【讨论】:

    【解决方案2】:

    你可以在这个答案中这样做: https://stackoverflow.com/a/16339352/1805974

    反序列化为动态对象:

    dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring);
    

    用法:

    string fieldnameFromFirstField =json.CRMNextFields[0].FieldName;
    

    这样它就像一本字典。不知道如果你把它做成一个 ExpandoObject,但它基本上是一个 IDictionary

    【讨论】:

      【解决方案3】:

      您的JSON 不是Dictionary&lt;object,object&gt;。您可以使用 JSON2CSHARP 检查 JSON 的结构。它应该是这样的。

      public class CRMNextField
      {
          public string FieldName { get; set; }
          public string CastRequired { get; set; }
          public string DefaultValue { get; set; }
          public string Description { get; set; }
          public string FieldID { get; set; }
          public string KeyID { get; set; }
          public string Label { get; set; }
          public string IsMandatory { get; set; }
          public string MaxValue { get; set; }
          public string MinValue { get; set; }
          public string Type { get; set; }
          public string IsLookup { get; set; }
          public string LinkedFields { get; set; }
          public string FieldKey { get; set; }
          public string TextFieldName { get; set; }
          public string ErrorMessage { get; set; }
          public string LayoutFieldId { get; set; }
          public string LayoutType { get; set; }
          public string IsDNC { get; set; }
          public string DNCField { get; set; }
          public string ReturnType { get; set; }
      }
      
      public class RootObject
      {
          public List<CRMNextField> CRMNextFields { get; set; }
      }
      

      现在你可以反序列化它了。

      var data = JsonConvert.DeserializeObject<List<RootObject>>(yourJSON);
      

      【讨论】:

        猜你喜欢
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 2013-11-18
        • 2020-02-19
        • 1970-01-01
        相关资源
        最近更新 更多