agowa338
Goto Top

Newtonsoft Json nested tables in csv umwandeln - C Sharp

Hallo,

ich habe aktuell das Problem, dass ich ein Json des Typs
{
  "groups": [  
    {
      "id": "111111111",  
      "name": "DummyName",  
      "shared_with": [  
        {
          "userid": "222222221",  
          "name": "Username1",  
          "alias": "",  
          "permissions": "read"  
        }
      ],
      "permissions": "owned"  
    },
    {
      "id": "111111112",  
      "name": "DummyNameZwei",  
      "shared_with": [  
        {
          "userid": "222222221",  
          "name": "Username1",  
          "alias": "",  
          "permissions": "read"  
        },
        {
          "userid": "222222222",  
          "name": "Username2",  
          "permissions": "read"  
        }
      ],
      "permissions": "owned"  
    }
  ]
}
mittels der Newtonsoft Json Library in eine CSV umwandeln muss. Nur machen mir die Arrays bei "shared_with" Probleme.
Das Problem ist nun sehr offensichtlich, die Konvertierung nimmt die Inneren Tabellen und nicht die äußere.
userid	name	alias	permissions	groups_Id

Ein Problem ist auch, dass ich in einer CSV keine Tabelle in einer Tabelle haben kann.
Hierfür habe ich auch noch keine Lösung.
Kann mir hierbei jemand helfen?

Mein Programmcode:
using System;
using System.Xml;
using System.Text;
using Newtonsoft.Json;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CreateSession.Helper
{
    public static class jsonToCsv
    {
        public static string getCsv(string jsonString) //jsonString As FormatedJsonString
        {
            XmlNode xml = JsonConvert.DeserializeXmlNode("{records:{record:" + jsonString + "}}");  
            XmlDocument xmldoc = new XmlDocument();
            //Create XmlDoc Object
            xmldoc.LoadXml(xml.InnerXml);
            //Create XML Steam 
            var xmlReader = new XmlNodeReader(xmldoc);
            DataSet dataSet = new DataSet();
            //Load Dataset with Xml
            dataSet.ReadXml(xmlReader);
            //return single table inside of dataset
            string csv = "";  
            //only the last table has data
            csv = ToCSV(dataSet.Tables[dataSet.Tables.Count - 1], "\t"); //Excel uses TabStop by default for csv  
            return csv;
        }
        private static string ToCSV(this DataTable table, string delimator)
        {
            var result = new System.Text.StringBuilder();
            for (int i = 0; i < table.Columns.Count; i++)
            {
                result.Append(table.Columns[i].ColumnName);
                result.Append(i == table.Columns.Count - 1 ? "\n" : delimator);  
            }
            foreach (DataRow row in table.Rows)
            {
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    result.Append(row[i].ToString());
                    result.Append(i == table.Columns.Count - 1 ? "\n" : delimator);  
                }
            }
            return result.ToString().TrimEnd(new char { '\r', '\n' });  
        }
    }
}

Content-ID: 281826

Url: https://administrator.de/contentid/281826

Ausgedruckt am: 22.11.2024 um 02:11 Uhr

122990
Lösung 122990 04.09.2015, aktualisiert am 05.09.2015 um 09:10:23 Uhr
Goto Top
Hallo,
ich würde das in der CSV folgendermaßen abstrahieren:

Da du hier ja anscheinend Gruppen mit mehreren Mitgliedern hast würde ich also einmal den Knoten Groups mit einer Schleife durchlaufen, und dann innerhalb dieser Schleife eine weitere die die Mitglieder shared_with der Gruppe ausliest.
In der CSV stellst du das dann so dar das pro User jeweils eine weitere Zeile mit den selben Gruppendaten erstellt wird, d.h. das die CSV dann quasi auszugsweise für deine beiden Gruppen so aussieht:
Gruppe_id;Gruppe_name;shared_with_id;shared_with_name
111111111;DummyName;222222221;Username1
111111112;DummyNameZwei;222222221;Username1
111111112;DummyNameZwei;222222222;Username2
Das ist mit den zwei verschachtelten Schleifen problemlos machbar, und ist eine gängige Methode sowas mit einer CSV darzustellen.

Gruß grexit