簡體   English   中英

從動態 JSON 數組中提取數據

[英]Extracting data from a dynamic JSON array

我正在將動態 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對象。

ResourceName 和動態日期應作為列標題。 由於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

有沒有辦法循環遍歷動態數組內容?

動態變量層次結構

只需獲取字符串並使用 JavaScriptSerializer 將其反序列化為本機對象。 例如,有這個 json:

您現在可以通過執行以下操作將 JSON 字符串反序列化為 Dynamic 數組:

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

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

示例.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();
    }
}

輸出:

輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM