JSON richtig deserialisieren klappt nicht

  • VB.NET
  • .NET 5–6

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von doLob.

    JSON richtig deserialisieren klappt nicht

    Liebe Gemeinde,
    ich möchte den Output von ffprobe auswerten und dann weiter verarbeiten.
    Dies geschieht bisher so:

    VB.NET-Quellcode

    1. Private Sub GetInfos()
    2. Dim sStreamFullName As String
    3. Dim JSON As String
    4. Dim Quote = Convert.ToChar(34)
    5. Using p As New Process
    6. p.StartInfo.FileName = "ffprobe.exe"
    7. p.StartInfo.Arguments = String.Format(" -v quiet -print_format json -show_chapters -show_format {0}{1}{0}", Quote, sStreamFullName)
    8. p.StartInfo.RedirectStandardOutput = True
    9. p.StartInfo.CreateNoWindow = True
    10. p.StartInfo.UseShellExecute = False
    11. p.Start()
    12. JSON = p.StandardOutput.ReadToEnd()
    13. End Using
    14. Dim jobj = JObject.Parse(JSON)
    15. Dim Chapterprops = JsonConvert.DeserializeObject(Of List(Of Dictionary(Of String, Object)))(jobj("chapters").ToString)
    16. Dim formatprops = JsonConvert.DeserializeObject(Of List(Of Dictionary(Of String, Object)))(jobj("format").ToString)
    17. 'Dim formatprops = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jobj("format").ToString) --> --> kein Fehler aber "tags" als Key und alle Unterkeys als Value
    18. End Sub


    die durch ffprob erzeugte Datei sieht so aus:

    HTML-Quellcode

    1. {
    2. "chapters": [
    3. {
    4. "id": 56893180208930440,
    5. "time_base": "1/1000000000",
    6. "start": 0,
    7. "start_time": "0.000000",
    8. "end": 274760000000,
    9. "end_time": "274.760000",
    10. "tags": {
    11. "title": "Chapter 01"
    12. }
    13. },
    14. {
    15. "id": 3350239497436273296,
    16. "time_base": "1/1000000000",
    17. "start": 274760000000,
    18. "start_time": "274.760000",
    19. "end": 2927000000000,
    20. "end_time": "2927.000000",
    21. "tags": {
    22. "title": "Chapter 02"
    23. }
    24. }
    25. ],
    26. "format": {
    27. "filename": "D:\\Users\\test.mkv",
    28. "nb_streams": 3,
    29. "nb_programs": 0,
    30. "format_name": "matroska,webm",
    31. "format_long_name": "Matroska / WebM",
    32. "start_time": "0.000000",
    33. "duration": "2927.000000",
    34. "size": "3195421199",
    35. "bit_rate": "8733641",
    36. "probe_score": 100,
    37. "tags": {
    38. "encoder": "libm win(x64-release)",
    39. "creation_time": "2022-06-01T16:55:27.000000Z"
    40. }
    41. }
    42. }


    mit Zeile 16 im Code gibt es eine Fehlermeldung
    Spoiler anzeigen
    Newtonsoft.Json.JsonSerializationException: "Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[System.Collections.Generic.Dictionary`2[System.String,System.Object]]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
    To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
    Path 'filename', line 2, position 13."



    Mit Zeile 18 wird zwar alles aufgelistet, jedoch ist dann "tags" der KEY und alle Unterkeys (encoder ,creation_time) werden dann als der zugehörige VALUE angezeigt und nicht wie gewünscht ebenfalls als KEY / VALUE Paar aufgelistet.
    Ich bin vor lauter sucherei schon ganz mischugge und brauche mal eure Hilfe.

    MfG
    Wenn ich das Zeugsl richtig interpretiere, ist innerhalb der Daten format nur ein einzelnes Objekt.
    Du versuchst aber daraus eine List(Of Dictionary(Of String, Object)) zu machen. Geht ja net. chapters startet ja auch mit [. Und das wird ja auch akzeptiert.
    Entweder sind die Daten falsch oder Du versuchst einen falschen Datentyp draus zu machen. Sag Du, was der Fall ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, deswegen ist mir ja schon schwindelig.
    Also die json Daten spuckt ja der Output von ffprobe so aus. Macht er über die Powershell ganz genau so. Das mit dem Array [] und den Objekten {} ist mir auch aufgefallen. Ich bekomme das nur nicht richtig eingeordnet.
    Ich möchte letzendlich wie bei den "chapters" auch bei "format" auf alle KEY / VALUE Werte zugreifen können.
    Tauchen da überhaupt mehrere format-Einträge auf? Wenn nicht, kann auch keine List(Of T) draus werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nö.Stimmt. Diesen Abschnitt gibt es immer nur ein einziges mal. Unter den "tags" findet man dort auch so eine Art HEADER Info (wenn vorhanden, im Beispiel ja nicht). Da wäre dann z.B Titel, Genre ..u.s.w. drin. Und gerade diese möchte ich
    dann als Wertepaar dann mal extrahieren.
    Dann würd ich einfach mal probieren, das entsprechend (anders) zu extrahieren:

    VB.NET-Quellcode

    1. Dim formatprops = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jobj("format").ToString)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,
    warum so kompliziert? Wenn du wirklich .NET6 unterwegs bist, brauchst du JSON.NET nicht. Einfach das komplette Json in die Zwischenablage kopiert, deinem Projekt eine neue Klasse hinzugefügt und dann Edit -> Paste Special -> Paste JSON as Classes. (Hab nur ein englisches VS)
    Somit hast du schon mal alle notwendigen Typen, um dein Json zu de-/serialisieren.

    Mit

    VB.NET-Quellcode

    1. Dim jsonObject = System.Text.Json.JsonSerializer.Deserialize(Of Rootobject)(jsonString)
    erzeugst du ein Objekt und kannst damit durch die Eigenschaften navigieren.

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

    @VaporiZed
    Genau daran haperts. Mit dieser Zeile bekomme ich die tags die ja eigentlich wieder aus KeyValuePairs bestehen als ein einziges Pair. "tags" als key und alle inhalte als ein value.

    @ISliceUrPanties
    Jap, gelesen habe ich drüber. Traue mich nur nicht ran, dafür eine Classe selber zu generieren.
    Mit VS war es ja dann ganz einfach. Jedoch habe ich beim deserialisieren immer einen Fehler.

    Quellcode

    1. Dim formatprops As Rootobject = System.Text.Json.JsonSerializer.Deserialize(Of Rootobject)(jobj.ToString)


    ......(JSON)
    System.Text.Json.JsonException: "The JSON value could not be converted to CutAudioFromMKV.Stream. Path: $.streams | LineNumber: 1 | BytePositionInLine: 16."
    oder ......(jobj.tostring)
    System.Text.Json.JsonException: "The JSON value could not be converted to CutAudioFromMKV.Stream. Path: $.streams | LineNumber: 1 | BytePositionInLine: 14."

    Ist die erzeugte json-Datei fehlerhaft?

    HIER die Zeilen -> Erst der Inhalt von jobj dann von JSON:
    Spoiler anzeigen
    {{
    "streams": [
    {
    "index": 0,
    "codec_name": "mpeg2video",


    "{" & vbCrLf & " ""streams"": [" & vbCrLf & " {" & vbCrLf & " ""index"": 0," & vbCrLf & " ""codec_name"": ""mpeg2video""


    MfG

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

    OK. Erledigt. Beim VS internen hinzufügen von JSON Klassen gab es dann diese Syntax Fehler.
    Nachdem ich die gleiche JSON Datei mit JsonUtils in Klassen gewandelt und einige Propertys manipuliert habe klappt es.
    mit:

    Quellcode

    1. Dim jsonObject = System.Text.Json.JsonSerializer.Deserialize(Of Rootobject)(json)


    Danke