3 votes

Extraction de données d'un tableau JSON dynamique

Je suis en train de convertir un objet JSON dynamique en Excel en C#. J'ai essayé les étapes suivantes. A partir de la base de données, j'obtiens la réponse ci-dessous sous forme de chaîne.

[ {"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} ]

Je dois convertir la chaîne ci-dessus en JSON et effectuer une opération en boucle afin de définir les en-têtes et les valeurs détaillées pour la création d'Excel. J'ai utilisé la méthode ci-dessous en créant un dynamic objet.

ResourceName et les dates dynamiques doivent servir d'en-têtes de colonne. Il est incapable de créer un modèle puisque le date sont dynamiques.

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

J'ai pu extraire les valeurs de QuickWatch, mais la sortie n'est générée qu'en cours d'exécution, comme ci-dessous.

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

Existe-t-il un moyen de parcourir en boucle le contenu du tableau dynamique ?

Dynamic var hierarchy

1voto

Bhaumik Shah Points 700

Il suffit de prendre la chaîne et d'utiliser le JavaScriptSerializer pour la désérialiser en un objet natif. Par exemple, en ayant ce json :

Vous pouvez maintenant désérialiser la chaîne JSON en un tableau de Dynamic en faisant :

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

0voto

sspaniel Points 582

Je recommande de désérialiser le JSON vers une collection de dictionnaires au lieu d'utiliser la fonction Dynamic cette méthode offre la sécurité du type et l'itération. L'exemple suivant utilise le paquet NuGet Newtonsoft.Json :

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
  }
]

Code :

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

Salida:

Output

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X