Feed data omzetten naar een HTML-table

Ingediend door Dirk Hornstra op 14-jun-2019 23:47

Op de deelnemerspagina op de site van Maarten van der Weijden staat een overzicht van de projecten (link). Ik heb een blog-artikel op mijn website geplaatst (link) en vond dat ook de mensen die weinig sponsoring gekregen hadden ook aandacht verdienen. In het netwerkverkeer zag ik dat een feed wordt aangeroepen die een stuk JSON-code terug geeft. Dat ziet er zo uit:


{"entities":{"b11521f5-b812-4103-b437-43d004e6bfeb":{"ticket":"TEAM_11STEDENZWEMEVENEMENT","currency":"EUR","collected_amount_expected":1000,"collected_amount":15561,"name":".....","description":".....","state":"open","gallery":"https:\/\/res.cloudinary.com\/iraiser\/image\/upload\/v1553847987\/wz2djwovt6bhyuksnuvl.jpg","ONDERZOEKSKEUZE":"0_geen_voorkeur_onderzoek","type":"participant","owner":{"is_company":false,"firstname":"....","lastname":"....","title

Je ziet dat het niet allemaal vaste "naam"-"waarde" combinaties zijn. Ik heb een console-applicatie gemaakt, hier de nuget Newtonsoft-Json toegevoegd, maar kon niet mijn eigen JsonConvert.DeserializeObject<mijnObject> aanroepen. Ik moest het dynamischer doen. Dat kan door de lap tekst om te zetten naar een JObject en zo door de "boom" te crawlen. Ik heb dit voor elkaar gebokst door op bepaalde punten breakpoints te zetten en via Quick Watch / de normale Watches het object te bekijken, daar de eigenschappen/functies van te bekijken om te zien hoe ik mijn gewenste waardes kan opvragen.

using System;
using System.IO;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace VanderweijdenApp
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("<table>");
            string filepath = @"...zwemprojecten.txt";
            string saveHtmlPath = @"....output_zwemmen.txt";
            string url = @"url waar json wordt aangeleverd";
            try {
                if (File.Exists(filepath) == false)
                {
                    using (System.Net.WebClient wc = new System.Net.WebClient())
                    {
                        string data = System.Text.UTF8Encoding.UTF8.GetString(wc.DownloadData(url));
                        File.WriteAllText(filepath, data);
                    }
                }

                JObject jsonData = JsonConvert.DeserializeObject<JObject>(File.ReadAllText(filepath));
                var rootNode = jsonData.First.First;
                foreach (JProperty child in rootNode.Children())
                {
                    string guidLink = child.Name;
                    string name = "";
                    string description = "";
                    string firstname = "";
                    string lastname = "";

                    foreach (JProperty v in child.Values())
                    {
                        switch (v.Name)
                        {
                            case "name":
                                name = v.Value.ToString();
                                break;
                            case "description":
                                description = v.Value.ToString();
                                break;
                            case "owner":
                                foreach (JProperty o in v.Value.Children())
                                {
                                    switch (o.Name)
                                    {
                                        case "firstname":
                                            firstname = o.Value.ToString();
                                            break;
                                        case "lastname":
                                            lastname = o.Value.ToString();
                                            break;
                                    }
                                }
                                break;
                        }
                    }
                    Console.WriteLine($"{guidLink}\t{firstname} {lastname}\t{name}\t{description}");
                    Console.WriteLine("================");
                    sb.AppendLine($"<tr><td><b>{firstname} {lastname}</b></td><td><b><a href=\"https://www.11stedenzwemtocht.nl/participant/#participant/view/{guidLink}\" target=\"_blank\" rel=\"noreferer noopener\">{name}</a></b></td></tr>");
                    sb.AppendLine($"<tr><td colspan=\"2\">{description}</td></tr>");
                    sb.AppendLine($"<tr><td colspan=\"2\"><hr/></td></tr>");
                }
                sb.AppendLine("</table>");
                File.WriteAllText(saveHtmlPath, sb.ToString());

            }
            catch (Exception x)
            { Console.WriteLine(x.ToString()); }
            Console.WriteLine("so far so good");
            Console.ReadKey();
        }
    }

}

Je ziet op mijn blog dat het gelukt is. Dus als je weet dat een bekende mee doet, maar kon je die op de site van de 11stedenzwemtocht niet vinden, dan kun je hier snel op naam zoeken en doorklikken naar het project.