Relationen aus Dataset in JSON

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Tigerente.

    Relationen aus Dataset in JSON

    Hallo zusammen,

    ich habe ein typ. Dataset "KeyDataRS" (siehe Bild).
    Die ParentID zeigt jeweils auf die ID eine Ebene höher.
    In Ebene1 gibt es z.B. ID 1,2
    In Ebene2 gibt es die ID 11,12 die auf ID 1 in Tabelle Ebene2 verweisen u.s.w.

    Über die Number in KeydataRS muss dann aus einer anderen Tabelle z.B. der Name der Gruppe geholt werden.
    Alles einzeln bekomme ich so hin, aber jetzt kommt mein Problem:
    Der JSON muss dann folgenden Ausbau bekommen:

    [{"op": "add", "path": "/groups", "value": [{"name": "1", "groups":[{"name":"11", "groups":[{"name":"21"}]},{"name":"12"}]}, {"name": "2" }]}]

    Der Ansatz hat mir nicht so richtig weiter geholfen, weil die Objekte dann ja jedesmal geschlossen werden und ich keinen Tree bekomme:

    VB.NET-Quellcode

    1. For Each rowEbene1 As KeyDataRS.Ebene1Row In Form2.KeyDataRS.Ebene1
    2. 'füge zum JSON hinzu...
    3. For Each rowEbene2 As KeyDataRS.Ebene2Row In rowEbene1.GetEbene2Rows()
    4. 'füge zum JSON hinzu...
    5. For Each rowEbene3 As KeyDataRS.Ebene3Row In rowEbene2.GetEbene3Rows()
    6. 'füge zum JSON hinzu...
    7. For Each rowEbene4 As KeyDataRS.Ebene4Row In rowEbene3.GetEbene4Rows()
    8. 'füge zum JSON hinzu...
    9. Next
    10. Next
    11. Next
    12. Next


    Newtonsoft hat da sicher etwas passendes, aber ich finde es einfach nicht.
    Hat jemand eine Idee?
    Dank im Voraus
    Bilder
    • Unbenannt.PNG

      32,61 kB, 595×198, 70 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tigerente“ ()

    Trick 17: DasDataSet.WriteXml(PFAD)

    Dann die datei einlesen und zu JSON vonvertieren:
    Source:
    stackoverflow.com/questions/81…o-xml-or-xml-to-json-in-c

    C#-Quellcode

    1. var json = new JavaScriptSerializer().Serialize(GetXmlData(XElement.Parse(xmlString)));
    2. private static Dictionary<string, object> GetXmlData(XElement xml)
    3. {
    4. var attr = xml.Attributes().ToDictionary(d => d.Name.LocalName, d => (object)d.Value);
    5. if (xml.HasElements) attr.Add("_value", xml.Elements().Select(e => GetXmlData(e)));
    6. else if (!xml.IsEmpty) attr.Add("_value", xml.Value);
    7. return new Dictionary<string, object> { { xml.Name.LocalName, attr } };
    8. }


    PS.

    Du hast ja schon newtonsoft in verwendung:
    newtonsoft.com/json/help/html/ConvertXmlToJson.htm

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    @Tigerente Wenn du bereits mit einem Dataset arbeitest, kannst du auch gleich deine Daten aus dem Dataset in einen Json-String konvertieren...

    VB.NET-Quellcode

    1. json As String = JsonConvert.SerializeObject(DeinDataSet, Formatting.Indented)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    Danke für die schnellen Antworten.
    @VB1963 Das war auch mein erster Gedanke, aber im Ergebnis werden die Relationen nicht aufgelöst:

    Quellcode

    1. ​{
    2. "Ebene1": [
    3. {
    4. "ID": 10,
    5. "ParentID": 0,
    6. "KeyType": "Group",
    7. "Number": "300"
    8. },
    9. {
    10. "ID": 27,
    11. "ParentID": 0,
    12. "KeyType": "Group",
    13. "Number": "1001"
    14. }
    15. ],
    16. "Ebene2": [
    17. {
    18. "ID": 56,
    19. "ParentID": 10,
    20. "KeyType": "Group",
    21. "Number": "301"
    22. },
    23. {
    24. "ID": 60,
    25. "ParentID": 10,
    26. "KeyType": "Group",
    27. "Number": "311"
    28. }
    29. ],
    30. "Ebene3": [],
    31. "Ebene4": []
    32. }


    Es werden nur die einzelnen Tabellen ausgegeben. ID56 müsste ja ein Kind von ID10 sein.

    @DTF Das xml sieht dann so aus:

    XML-Quellcode

    1. <?xml version="1.0" standalone="yes"?>
    2. <KeyDataRS xmlns="http://tempuri.org/KeyDataRS.xsd">
    3. <Ebene1>
    4. <ID>10</ID>
    5. <ParentID>0</ParentID>
    6. <KeyType>Group</KeyType>
    7. <Number>300</Number>
    8. </Ebene1>
    9. <Ebene1>
    10. <ID>27</ID>
    11. <ParentID>0</ParentID>
    12. <KeyType>Group</KeyType>
    13. <Number>1001</Number>
    14. </Ebene1>
    15. <Ebene2>
    16. <ID>56</ID>
    17. <ParentID>10</ParentID>
    18. <KeyType>Group</KeyType>
    19. <Number>301</Number>
    20. </Ebene2>
    21. <Ebene2>
    22. <ID>60</ID>
    23. <ParentID>10</ParentID>
    24. <KeyType>Group</KeyType>
    25. <Number>311</Number>
    26. </Ebene2>
    27. </KeyDataRS>


    So sieht Newtonsoft ja auch nicht die Kind-Eltern Beziehung.
    Ja, aber der JSON muss so aussehen:
    [{"op": "add", "path": "/groups", "value": [{"name": "300", "groups":[{"name": "301"},{"name": "311"}]}, {"name": "1001" }]}]
    Bilder
    • Unbenannt1.PNG

      17,87 kB, 229×228, 26 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tigerente“ ()

    Gibt es vielleich eine Möglichkeit über diesen Ansatz:

    VB.NET-Quellcode

    1. Public Class Ebene0
    2. Public Property Groups As List(Of Ebene1)
    3. End Class
    4. Public Class Ebene1
    5. Public Property Id As String
    6. Public Property Number As String
    7. End Class
    8. Dim Ebene0 As New Ebene0
    9. Dim Ebene1 As New List(Of Ebene1)
    10. For Each rowEbene1 As KeyDataRS.Ebene1Row In Form2.KeyDataRS.Ebene1
    11. Dim Ebene1_Groups As New Ebene1 With {
    12. .Id = rowEbene1(0),
    13. .Number = rowEbene1(3)}
    14. Ebene1.Add(Ebene1_Groups)
    15. For Each rowEbene2 As KeyDataRS.Ebene2Row In rowEbene1.GetEbene2Rows()
    16. Next
    17. Next
    18. Ebene0.Groups = Ebene1
    19. Dim _JSON As String = JsonConvert.SerializeObject(Ebene0, Formatting.Indented)


    Quellcode

    1. {
    2. "Groups": [
    3. {
    4. "Id": "9",
    5. "Number": "1001"
    6. },
    7. {
    8. "Id": "10",
    9. "Number": "1002"
    10. }
    11. ]
    12. }


    Jedoch müssten dann für rowEbene1.GetEbene2Rows() die "Kinder" von ID 10 kommen und mit dieser List verbunden werden.

    @VB1963 dein Ansatz hat dann funktioniert, als ich in den Beziehungen den Haken bei "Geschachtelte Beziehung" gesetzt habe.
    Aber ich muss die Knoten dann noch mit anderen Daten anreichern - das ist halt Mühselig.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Tigerente“ ()