DataTable(s) / JSON Klassen Properies

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    DataTable(s) / JSON Klassen Properies

    Hallo!

    Ich bekommst iwie nicht geregelt!

    Ich habe jetzt ein JSON-String in eine JSON-Klasse deserialisiert, so kann ich schonmal auf die einzelnen Werte zugreifen!

    Mein Zugriff erfolgt wie folgt:

    VB.NET-Quellcode

    1. jsonResult.Results(0).Recordings(0).Releasegroups(0).Releases(0).Mediums(0).Tracks(0).Artists(0)

    Wobei die Nullen in den Klammern immer andere Zweige sind.
    Jetzt wollte ich, um auf die verschiedenen Daten zuzugreifen, für jedes Property bzw. Property-Array eine Combobox erstellen um die Verschachtelung zu realisieren.

    So sieht meine JSON-Klasse aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Artist
    2. <JsonProperty("id")> Public Property Id As String
    3. <JsonProperty("name")> Public Property Name As String
    4. End Class
    5. Public Class Track
    6. <JsonProperty("artists")> Public Property Artists As Artist()
    7. <JsonProperty("position")> Public Property Position As Integer
    8. <JsonProperty("id")> Public Property Id As String
    9. <JsonProperty("title")> Public Property Title As String
    10. End Class
    11. Public Class Medium
    12. <JsonProperty("tracks")> Public Property Tracks As Track()
    13. <JsonProperty("position")> Public Property Position As Integer
    14. <JsonProperty("track_count")> Public Property TrackCount As Integer
    15. <JsonProperty("format")> Public Property Format As String
    16. <JsonProperty("title")> Public Property Title As String
    17. End Class
    18. Public Class Release
    19. <JsonProperty("mediums")> Public Property Mediums As Medium()
    20. <JsonProperty("id")> Public Property Id As String
    21. End Class
    22. Public Class Releasegroup
    23. <JsonProperty("releases")> Public Property Releases As Release()
    24. <JsonProperty("id")> Public Property Id As String
    25. End Class
    26. Public Class Recording
    27. <JsonProperty("releasegroups")> Public Property Releasegroups As Releasegroup()
    28. <JsonProperty("sources")> Public Property Sources As Integer
    29. <JsonProperty("id")> Public Property Id As String
    30. End Class
    31. Public Class Result
    32. <JsonProperty("recordings")> Public Property Recordings As Recording()
    33. <JsonProperty("score")> Public Property Score As Double
    34. <JsonProperty("id")> Public Property Id As String
    35. End Class
    36. Public Class c_JSON_ROOT
    37. <JsonProperty("results")> Public Property Results As Result()
    38. <JsonProperty("status")> Public Property Status As String
    39. End Class


    Wie kann man nun bei ändern der Combobox-Werte die verschiedenen Daten abrufen?
    ​Kann man den gesamten JSON nicht in eine Datenbank schreiben und abrufen, weil es gibt auch ungenutzte Properties die dann eine Fehlermeldung schmeissen..hab das bis jetzt immer mit Try/Catch abgefragt, weil VS schon bei der "If is not" Abfrage eine Exception schmiss!

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

    Mit Databinding müsste das gehen.
    Man muss dafür eine Objekt-DataSource anlegen - leider habich noch kein Film dazu gemacht.

    Warum willst du solch in eine Datenbank schreiben - hast du > 10.000 Datensätze?
    Oder soll das eine Multi-User-Anwendung werden?

    Ansonsten sehe ich hier keinen Bedarf für eine Db.
    Kann ich den sieben Properties iwie die Comboboxen zuweisen?
    So dass ich, wenn ich die Comboboxen-Zahl ändere, automatisch in den neuen Datenzweig komme?

    Für die erste Combobox hab ich jetzt sowas:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. If jsonResult.Results IsNot Nothing Then
    2. For _a = 0 To jsonResult.Results.Count - 1
    3. Try
    4. ComboBox1.Items.Add(jsonResult.Results(_a).Score)
    5. Catch ex As Exception
    6. Continue For
    7. End Try
    8. Next
    9. ComboBox1.SelectedIndex = 0
    10. End If
    Dann machste wohl was nicht ganz richtig.
    Anbei meine Lösung - hat mich fast 2h gekostet
    Beachte, dass ich das Datenmodell geändert habe, die Listen sind jetzt List(of ) statt Array.
    Dieses, damit ich vernünftig Daten generieren konnte.
    Dateien
    Ähm, wie bekomm ich da denn jetzt meine JSON-Daten rein?!?

    VB.NET-Quellcode

    1. Dim _json As String = File.ReadAllText("json.txt")
    2. Dim jsonResult As c_JSON_ROOT
    3. jsonResult = JsonConvert.DeserializeObject(Of c_JSON_ROOT)(_json)


    Hab des jetzt mal soweit umgeändert, aber so ganz stimmt des noch nich!
    Hab z.B. doppelte Einträge in den Comboboxen! :|
    Dateien
    • json.txt

      (69,51 kB, 124 mal heruntergeladen, zuletzt: )
    • Parent7ChildView.zip

      (386,3 kB, 110 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Morrison“ ()

    So hab ichs jetzt, wie im vorherigen Post als Anhang:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.IO
    3. Imports Newtonsoft.Json
    4. Public Class frmParent7ChildView
    5. Dim _json As String = File.ReadAllText("json.txt")
    6. Private _Roots As New BindingList(Of c_JSON_ROOT)
    7. Dim jsonResult As c_JSON_ROOT
    8. Public Sub New()
    9. InitializeComponent()
    10. jsonResult = JsonConvert.DeserializeObject(Of c_JSON_ROOT)(_json)
    11. Dim root = New c_JSON_ROOT With {.Status = jsonResult.Status, .Results = jsonResult.Results}
    12. _Roots.Add(root)
    13. For b = 0 To root.Results.Count - 1
    14. Dim Result = New Result With {.Score = jsonResult.Results(b).Score,
    15. .Recordings = jsonResult.Results(b).Recordings,
    16. .Id = jsonResult.Results(b).Id}
    17. root.Results.Add(Result)
    18. For c = 0 To Result.Recordings.Count - 1
    19. Dim Recording = New Recording With {.Id = Result.Recordings(c).Id,
    20. .Releasegroups = Result.Recordings(c).Releasegroups,
    21. .Sources = Result.Recordings(c).Sources}
    22. Result.Recordings.Add(Recording)
    23. For d = 0 To Recording.Releasegroups.Count - 1
    24. Dim Releasegroup = New Releasegroup With {.Id = Recording.Releasegroups(d).Id,
    25. .Releases = Recording.Releasegroups(d).Releases}
    26. Recording.Releasegroups.Add(Releasegroup)
    27. For e = 0 To Releasegroup.Releases.Count - 1
    28. Dim Release = New Release With {.Id = Releasegroup.Releases(e).Id,
    29. .Mediums = Releasegroup.Releases(e).Mediums}
    30. Releasegroup.Releases.Add(Release)
    31. For f = 0 To Release.Mediums.Count - 1
    32. Dim Medium = New Medium With {.Title = Release.Mediums(f).Title,
    33. .Format = Release.Mediums(f).Format,
    34. .Position = Release.Mediums(f).Position,
    35. .TrackCount = Release.Mediums(f).TrackCount,
    36. .Tracks = Release.Mediums(f).Tracks}
    37. Release.Mediums.Add(Medium)
    38. For g = 0 To Medium.Tracks.Count - 1
    39. Dim Track = New Track With {.Id = Medium.Tracks(g).Title,
    40. .Position = Medium.Tracks(g).Position,
    41. .Artists = Medium.Tracks(g).Artists,
    42. .Title = Medium.Tracks(g).Title}
    43. Medium.Tracks.Add(Track)
    44. For h = 0 To GetType(Track).GetProperties().Length
    45. Dim Artist = New Artist With {.Name = Track.Artists(h).Id,
    46. .Id = Track.Artists(h).Name}
    47. Track.Artists.Add(Artist)
    48. Next
    49. Next
    50. Next
    51. Next
    52. Next
    53. Next
    54. Next
    55. C_JSON_ROOTBindingSource.DataSource = _Roots
    56. End Sub
    57. End Class


    Nur hätt ich gern in den Comboboxen nur die "Counts" der jeweiligen "List(of xclass)", sodass ich dann in einer DataGridView die damit verbundenen Properties aufgezeigt bekomme.

    Auch hab ich mit den For Next Schleifen doppelte Einträge.

    Mit dieser DataTable wollte ich ein DataGridView füllen:

    pic-upload.de/view-33882977/Folie1.jpg.html



    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Morrison“ ()

    probierma so:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. jsonResult = JsonConvert.DeserializeObject(Of c_JSON_ROOT)(_json)
    4. _Roots.Add(jsonResult)
    5. C_JSON_ROOTBindingSource.DataSource = _Roots
    6. End Sub

    Und probier auchma so - das ist wortwörtlich, was ich in post#8 sage:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. jsonResult = JsonConvert.DeserializeObject(Of c_JSON_ROOT)(_json)
    4. C_JSON_ROOTBindingSource.DataSource = jsonResult
    5. End Sub

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

    Ja, soweit funzt des schonmal einwandfrei! Nur..
    ..wie bekomme ich jetzt in den Comboboxen nur die Anzahl der List.Counts?
    Also bei "ResultsComboBox" hab ich jetzt "DisplayMember" auf Score, das ist OK so, aber bei den anderen Comboboxen möchte ich nur die Anzahl der Länge der List angezeigt bekommen, weil wenn da die ID mit irgend
    ´ner Zahlencombo steht kann man da nix mit anfangen!

    Hab schon gedacht die Klassen zu erweitern um ein Integer-Array-Property?!?
    Hmm, naja..nee..es ist ja ein Integer-Wert!
    ​Damit ich den aber in die Combobox bekomme brauch ich den Integer-Wert als Array..
    ​wenn ich z.B. vier "Results" hab bringt mir die "Results.count" nix ich muss ja vier Items hinzufügen stellvertretend für die Einträge von Result.
    Und ein .Count.toArray oder so gibbed nich..
    ​..iwie sowas müsste ich dann ja in den Comboboxen angezeigt bekommen:

    VB.NET-Quellcode

    1. ​MediumsComboBox.Items.IndexOf(MediumsComboBox.SelectedItem)

    Aber das gibt das DataBinding nicht her..
    ​..deswegen dachte ich den Klassen ein Integer-Array hinzuzufügen mit der Nummerierung der Werte!
    grr..

    klappt immer noch nicht!

    ​Hab jetzt nochmal sieben ComboBoxes hinzugefügt die mir nur die Indexes des gewählten Properties anzeigen sollen.
    Aber die aktualisieren sich immer erst bei der nächsten Änderung der Comboboxen!

    ​Wie bekomm ich das denn nun synchron, oder wie schreibe ich nur den Index in die Combobox??

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Imports System.IO
    3. Imports Newtonsoft.Json
    4. Public Class frmParent7ChildView
    5. Dim _json As String = File.ReadAllText("json.txt")
    6. Dim jsonResult As c_JSON_ROOT
    7. Public Sub New()
    8. InitializeComponent()
    9. jsonResult = JsonConvert.DeserializeObject(Of c_JSON_ROOT)(_json)
    10. C_JSON_ROOTBindingSource.DataSource = jsonResult
    11. End Sub
    12. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    13. ResultsComboBox.SelectedIndex = ComboBox1.SelectedIndex
    14. End Sub
    15. Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
    16. RecordingsComboBox.SelectedIndex = ComboBox2.SelectedIndex
    17. End Sub
    18. Private Sub ComboBox3_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox3.SelectedIndexChanged
    19. ReleasegroupsComboBox.SelectedIndex = ComboBox3.SelectedIndex
    20. End Sub
    21. Private Sub ComboBox4_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox4.SelectedIndexChanged
    22. ReleasesComboBox.SelectedIndex = ComboBox4.SelectedIndex
    23. End Sub
    24. Private Sub ComboBox5_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox5.SelectedIndexChanged
    25. MediumsComboBox.SelectedIndex = ComboBox5.SelectedIndex
    26. End Sub
    27. Private Sub ComboBox6_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox6.SelectedIndexChanged
    28. TracksComboBox.SelectedIndex = ComboBox6.SelectedIndex
    29. End Sub
    30. Private Sub ComboBox7_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox7.SelectedIndexChanged
    31. ArtistsComboBox.SelectedIndex = ComboBox7.SelectedIndex
    32. End Sub
    33. Private Sub _setCoboData()
    34. ComboBox2.Items.Clear()
    35. ComboBox3.Items.Clear()
    36. ComboBox4.Items.Clear()
    37. ComboBox5.Items.Clear()
    38. ComboBox6.Items.Clear()
    39. ComboBox7.Items.Clear()
    40. For i = 1 To RecordingsComboBox.Items.Count
    41. ComboBox2.Items.Add(i)
    42. Next
    43. ComboBox2.SelectedIndex = RecordingsComboBox.SelectedIndex
    44. For i = 1 To ReleasegroupsComboBox.Items.Count
    45. ComboBox3.Items.Add(i)
    46. Next
    47. ComboBox3.SelectedIndex = ReleasegroupsComboBox.SelectedIndex
    48. For i = 1 To ReleasesComboBox.Items.Count
    49. ComboBox4.Items.Add(i)
    50. Next
    51. ComboBox4.SelectedIndex = ReleasesComboBox.SelectedIndex
    52. For i = 1 To MediumsComboBox.Items.Count
    53. ComboBox5.Items.Add(i)
    54. Next
    55. ComboBox5.SelectedIndex = MediumsComboBox.SelectedIndex
    56. For i = 1 To TracksComboBox.Items.Count
    57. ComboBox6.Items.Add(i)
    58. Next
    59. ComboBox6.SelectedIndex = TracksComboBox.SelectedIndex
    60. For i = 1 To ArtistsComboBox.Items.Count
    61. ComboBox7.Items.Add(i)
    62. Next
    63. ComboBox7.SelectedIndex = ArtistsComboBox.SelectedIndex
    64. ComboBox1.Refresh()
    65. ComboBox2.Refresh()
    66. ComboBox3.Refresh()
    67. ComboBox4.Refresh()
    68. ComboBox5.Refresh()
    69. ComboBox6.Refresh()
    70. ComboBox7.Refresh()
    71. End Sub
    72. Private Sub ArtistsBindingSource_CurrentChanged(sender As Object, e As EventArgs) Handles ArtistsBindingSource.ListChanged
    73. Debug.WriteLine("Artist Changed!")
    74. _setCoboData()
    75. End Sub
    76. End Class
    Jup! ;)

    Was mir halt noch fehlte war eine Individualisierung der gegebenen Daten bzw. des DataBindings..
    ..habs jetzt so gelöst:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ResultsBindingSource_CurrentItemChanged(sender As Object, e As EventArgs) Handles ResultsBindingSource.CurrentItemChanged,
    2. ArtistsBindingSource.CurrentItemChanged,
    3. RecordingsBindingSource.CurrentItemChanged,
    4. TracksBindingSource.CurrentItemChanged,
    5. ReleasegroupsBindingSource.CurrentItemChanged,
    6. ReleasesBindingSource.CurrentItemChanged,
    7. MediumsBindingSource.CurrentItemChanged
    8. _setCoboData()
    9. End Sub



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