JSON Deserializing

  • Allgemein

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ery.

    JSON Deserializing

    Hallo!

    Ich versuche mich gerade mit JSON und habe wohl ein totales Verständnissproblem...

    VB.NET-Quellcode

    1. {"solar_system":[30003086]}

    Diese Rückgabe benötige ich aufgesplittet. Grundsätzlich nur solar_system zur Nummer danach. Warum die Ausgabe in einem Array stattfindet kann ich nicht sagen - das ganze kann sowieso nur einen Wert zurückgeben... Bevor ich den Rückgabestring anpasse (Brackets entferne...) würde ich diesen gerne richtig auslesen...
    Das habe ich schon:

    VB.NET-Quellcode

    1. Using w As New System.Net.WebClient
    2. w.Headers.Add("user-agent", "RV-KG Discord Fetcher,")
    3. Dim json_data As String = ""
    4. json_data = w.DownloadString("https://esi.tech.ccp.Is/latest/search/?categories=solar_system&datasource=tranquility&language=en-us&search=" & checkstring & "&strict=true")
    5. 'Da is da wurm drinnen...
    6. Dim reply As List(Of SystemIDJSON) = JsonConvert.DeserializeObject(Of List(Of SystemIDJSON))(json_data)
    7. e.Message.RespondAsync(reply(0).Token)
    8. End Using
    9. End Function
    10. Structure SystemIDJSON
    11. <JsonProperty("solar_system")>
    12. Public Property Token() As String
    13. Get
    14. Return Me._token
    15. End Get
    16. Private Set(value As String)
    17. Me._token = value
    18. End Set
    19. End Property
    20. <JsonIgnore>
    21. Private _token As String
    22. End Structure


    Die Meldung lautet "Newtonsoft.Json.JsonSerializationException: "Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Intel_Bot_Core.SystemIDJSON]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly."
    Irgendwo lade ich etwas in ein Array welches es nicht gibt oder anders rum. Ich sehe nur nicht wo - bzw. ich weiß nicht wie ich die Struktur richtig anpassen soll... (Zumindest wie ich es anpassen soll damit es funktionieren würde...).
    Hänge jetzt schon seit vier Stunden an dem Problem q.q

    Danke...

    VB.NET-Quellcode

    1. Dim reply As List(Of SystemIDJSON) = JsonConvert.DeserializeObject(Of SystemIDJSON)(json_data)


    Probier mal so, SystemIDJSON ist ja kein Array im JSON String.

    Zudem könnte es auch sein, dass es immer noch nicht geht weil es eine Zahl ist und kein String. Versuch also vielleicht wenns nicht geht auch ein Int -Array zu nehmen anstatt String-Array, wobei ich eig. glaube das JSON das intern konvertiert.
    Mit deiner obigen Zeile kommt "Der Wert vom Typ "SystemIDJSON" kann nicht in "List(Of SystemIDJSON)" konvertiert werden."

    Auch wenn es eine Zahl ist, als String sollte es dann ja trotzdem klappen, oder? Könnten ja auch Werte als Stringarray sein

    VB.NET-Quellcode

    1. Dim reply As SystemIDJSON = JsonConvert.DeserializeObject(Of SystemIDJSON)(json_data)


    Sorry, ich komme aus C# und benutze eig. meist das var Schlüsselwort, das erspart einem den Typ zweimal auszuschreiben. Wenn wir hinten nur noch SystemIDJSON deserialisieren müssen wir die Variable vorne natürlich auch nur als SystemIDJSON definieren und nicht als List.

    Naja wenn es implizit gecastet wird klappt das mit dem Integer To String, falls aber nicht muss das natürlich explizit geschehen und damit würde dann ein Int() Array in Frage kommen. Glaub' aber, dass das echt nicht das Problem ist, das wird JSON.net schon machen, kanns aber leider nicht 100% sagen weil ich es gerade nich testen kann.
    Wenn ich das so anpasse bekomme ich den Fehler "Newtonsoft.Json.JsonReaderException: "Unexpected character encountered while parsing value: [. Path 'solar_system', line 1, position 17.""
    Weil ich eben das Bracket für die List "[]" in einem nicht erwarteten Kontext (eben ohne Liste) bekomme.

    Und genau dort scheitere ich irgendwie... Ich schaffs weder mit noch ohne Liste und seh nicht mehr weiter :(
    Okay, also so funktioniert es bei mir:

    Struktur:

    VB.NET-Quellcode

    1. Public Structure SystemIDJSON
    2. <JsonProperty("solar_system")>
    3. Public Property Token As String()
    4. End Structure


    Codezeile:

    VB.NET-Quellcode

    1. Dim reply = JsonConvert.DeserializeObject(Of SystemIDJSON)(json_data)


    Wenn es nicht klappt, dann schau dir bitte mal den json_data String beim debuggen an, nicht das der irgendwie korrupt ist.
    ... und das wars auch schon - vielen lieben Dank! Den unteren Teil habe ich auch selbst schon mal so gehabt, die Struktur aber nicht (und was diese Struktur von mir macht habe ich noch nicht verstanden, die habe ich in meinen anderen Programmteilen so verwendet...)
    Blicke in diesem JSON leider nicht wirklich durch...
    Wozu gibt es JSON Utils?
    Das erzeugt dir die Klassenstruktur aus jedem gültgen JSON-String.
    In deinem (einfachen) Fall wäre es

    VB.NET-Quellcode

    1. Public Class SystemIDJSON
    2. <JsonProperty("solar_system")>
    3. Public Property solar_system As Integer()
    4. End Class
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Werde ich mir auf jeden Fall ansehen - habe meine Daten bisher immer mit einer selbstgeschriebenen Text-Datei gespeichert und einfach per Separator getrennt - JSON ist da natürlich um einiges besser um etwas zu speichern - vor allem mit allgemein gültigem Format.

    petaod, das kannte ich gar nicht - super nützlich - danke!