【问题标题】:Extracting data from a dynamic JSON array从动态 JSON 数组中提取数据
【发布时间】:2020-04-09 20:41:02
【问题描述】:

我正在将动态 JSON 对象转换为 C# 中的 Excel。我已经尝试了以下步骤。 从数据库中,我得到以下响应作为字符串。

[ {"ResourceName":"AH","ProjectID":1,"WeekNo":2,"02 Dec 2019":7.00,"03 Dec 2019":7.50,"04 Dec 2019":7.00,"05 Dec 2019":7.50,"06 Dec 2019":7.00},{"ResourceName":"CK","ProjectID":1,"WeekNo":2,"02 Dec 2019":6.00,"03 Dec 2019":5.00,"04 Dec 2019":3.00,"05 Dec 2019":2.00,"06 Dec 2019":5.00}, {"ResourceName":"AH","ProjectID":1,"WeekNo":3,"09 Dec 2019":6.00,"10 Dec 2019":7.50,"11 Dec 2019":7.00,"12 Dec 2019":7.50,"13 Dec 2019":8.00},{"ResourceName":"CK","ProjectID":1,"WeekNo":3,"09 Dec 2019":6.00,"10 Dec 2019":4.00,"11 Dec 2019":null,"12 Dec 2019":5.00,"13 Dec 2019":4.00},{"ResourceName":"SL","ProjectID":1,"WeekNo":3,"09 Dec 2019":null,"10 Dec 2019":1.50,"11 Dec 2019":null,"12 Dec 2019":1.50,"13 Dec 2019":0.50}, {"ResourceName":"AH","ProjectID":1,"WeekNo":4,"16 Dec 2019":7.00},{"ResourceName":"CK","ProjectID":1,"WeekNo":4,"16 Dec 2019":3.00} ]

我需要将上述字符串转换为 JSON 并执行循环操作,以便为 Excel 创建设置标题和详细信息值。我使用下面的方法创建了一个dynamic 对象。

资源名称和动态日期应作为列标题。由于date 值是动态的,因此无法创建模型。

using System.Web.Helpers;
dynamic jsonObject = Json.Decode(response);

我能够从 QuickWatch 中提取值,但是,输出仅在运行时生成,如下所示。

(new System.Collections.Generic.Mscorlib_DictionaryDebugView<string, object>(((System.Web.Helpers.DynamicJsonObject)((System.Web.Helpers.DynamicJsonArray)jsonObject)._arrayValues[0])._values).Items[0]).Key

有没有办法循环遍历动态数组的内容?

【问题讨论】:

  • 你应该使用 JSON.NET 并传递一个字典示例here
  • @styx JSON 字段是动态的。所以无法创建模型。

标签: c# arrays json dynamic


【解决方案1】:

只需获取字符串并使用 JavaScriptSerializer 将其反序列化为原生对象。例如,有这个 json:

您现在可以通过执行以下操作将 JSON 字符串反序列化为 Dynamic 数组:

JavaScriptSerializer js = new JavaScriptSerializer();
var resourceData =  js.Deserialize<Dynamic[]>(json);

【讨论】:

  • 谢谢鲍米克。 Dynamic的定义是什么
  • 动态关键字是 C# 4.0 中的新关键字,用于告诉编译器变量的类型可以更改,或者直到运行时才知道。可以将其视为无需强制转换即可与对象交互。
【解决方案2】:

我建议将 JSON 反序列化为字典集合,而不是使用 Dynamic,此方法提供类型安全性和迭代。以下示例使用 Newtonsoft.Json NuGet 包:

sample.json:

[
  {
    "ResourceName": "AH",
    "ProjectID": 1,
    "WeekNo": 2,
    "02 Dec 2019": 7.00,
    "03 Dec 2019": 7.50,
    "04 Dec 2019": 7.00,
    "05 Dec 2019": 7.50,
    "06 Dec 2019": 7.00
  },
  {
    "ResourceName": "CK",
    "ProjectID": 1,
    "WeekNo": 2,
    "02 Dec 2019": 6.00,
    "03 Dec 2019": 5.00,
    "04 Dec 2019": 3.00,
    "05 Dec 2019": 2.00,
    "06 Dec 2019": 5.00
  },
  {
    "ResourceName": "AH",
    "ProjectID": 1,
    "WeekNo": 3,
    "09 Dec 2019": 6.00,
    "10 Dec 2019": 7.50,
    "11 Dec 2019": 7.00,
    "12 Dec 2019": 7.50,
    "13 Dec 2019": 8.00
  },
  {
    "ResourceName": "CK",
    "ProjectID": 1,
    "WeekNo": 3,
    "09 Dec 2019": 6.00,
    "10 Dec 2019": 4.00,
    "11 Dec 2019": null,
    "12 Dec 2019": 5.00,
    "13 Dec 2019": 4.00
  },
  {
    "ResourceName": "SL",
    "ProjectID": 1,
    "WeekNo": 3,
    "09 Dec 2019": null,
    "10 Dec 2019": 1.50,
    "11 Dec 2019": null,
    "12 Dec 2019": 1.50,
    "13 Dec 2019": 0.50
  },
  {
    "ResourceName": "AH",
    "ProjectID": 1,
    "WeekNo": 4,
    "16 Dec 2019": 7.00
  },
  {
    "ResourceName": "CK",
    "ProjectID": 1,
    "WeekNo": 4,
    "16 Dec 2019": 3.00
  }
]

代码:

static void Main(string[] args)
{
    string json = File.ReadAllTextAsync("sample.json").Result;
    var deserializedJson = JsonConvert.DeserializeObject<IEnumerable<IDictionary<string, string>>>(json);

    foreach(var dictionary in deserializedJson)
    {
        Console.WriteLine(" -- Record --");

        foreach(var keyValuePair in dictionary)
        {
            Console.WriteLine($"{keyValuePair.Key}:{keyValuePair.Value}");
        }

        Console.WriteLine();
    }
}

输出:

【讨论】:

    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多