Fehler beim Deserialisieren von JSON - System.InvalidCastException

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 59 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

    Fehler beim Deserialisieren von JSON - System.InvalidCastException

    Hallo miteinander :)

    ich versuche gerade, einen JSON String zu deserialisieren und es kommt diese Fehlermeldung: Das Objekt des Typs "Newtonsoft.Json.Linq.JObject" kann nicht in Typ "Root" umgewandelt werden.

    Ich habe mir die Datenklasse mit diesem Konverter aus dem JSON erstellen lassen: json2csharp.com

    Herausgekommen ist Folgendes (ich hab die Klasse MusicBrainzAlbumData aussenrum gemacht):

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MusicBrainzAlbumData
    2. Public Class Area
    3. Public Property id As String
    4. Public Property name As String
    5. Public Property type As Object
    6. '<JsonProperty("sort-name")>
    7. Public Property sortname As String
    8. Public Property disambiguation As String
    9. '<JsonProperty("iso-3166-1-codes")>
    10. Public Property iso31661codes As List(Of String)
    11. '<JsonProperty("type-id")>
    12. Public Property typeid As Object
    13. End Class
    14. Public Class CoverArtArchive
    15. Public Property front As Boolean
    16. Public Property count As Integer
    17. Public Property artwork As Boolean
    18. Public Property darkened As Boolean
    19. Public Property back As Boolean
    20. End Class
    21. Public Class Disc
    22. Public Property id As String
    23. Public Property offsets As List(Of Integer)
    24. Public Property sectors As Integer
    25. '<JsonProperty("offset-count")>
    26. Public Property offsetcount As Integer
    27. End Class
    28. Public Class Medium
    29. Public Property discs As List(Of Disc)
    30. Public Property format As String
    31. '<JsonProperty("format-id")>
    32. Public Property formatid As String
    33. Public Property position As Integer
    34. '<JsonProperty("track-count")>
    35. Public Property trackcount As Integer
    36. Public Property title As String
    37. End Class
    38. Public Class Release
    39. '<JsonProperty("packaging-id")>
    40. Public Property packagingid As String
    41. '<JsonProperty("text-representation")>
    42. Public Property textrepresentation As TextRepresentation
    43. Public Property id As String
    44. Public Property datum As String
    45. Public Property disambiguation As String
    46. Public Property quality As String
    47. Public Property title As String
    48. Public Property barcode As String
    49. Public Property media As List(Of Medium)
    50. Public Property status As String
    51. Public Property asin As String
    52. '<JsonProperty("status-id")>
    53. Public Property statusid As String
    54. Public Property packaging As String
    55. '<JsonProperty("release-events")>
    56. Public Property releaseevents As List(Of ReleaseEvent)
    57. Public Property country As String
    58. '<JsonProperty("cover-art-archive")>
    59. Public Property coverartarchive As CoverArtArchive
    60. End Class
    61. Public Class ReleaseEvent
    62. Public Property datum As String
    63. Public Property area As Area
    64. End Class
    65. Public Class Root
    66. Public Property sectors As Integer
    67. Public Property offsets As List(Of Integer)
    68. '<JsonProperty("offset-count")>
    69. Public Property offsetcount As Integer
    70. Public Property releases As List(Of Release)
    71. Public Property id As String
    72. End Class
    73. Public Class TextRepresentation
    74. Public Property script As String
    75. Public Property language As String
    76. End Class
    77. End Class


    Das Original-JSON sieht so aus:

    Spoiler anzeigen
    {"id":"2yeDPY5_bCqQjLWXRoKSw15NSNo-","offsetcount":11,"sectors":184035,"releases":[{"datum":"2000-02-08","status":"Official","quality":"normal","media":[{"discs":[{"offsets":[150,17695,37555,54850,69407,89350,107230,121315,140962,155692,166937],"id":"2yeDPY5_bCqQjLWXRoKSw15NSNo-","offsetcount":11,"sectors":184035},{"sectors":184035,"id":"CAzJSPfiE1bxRnDNI0iQwqfl_LY-","offsetcount":11,"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937]},{"sectors":184062,"offsetcount":11,"id":"HSyom1OwaP3oIHbrMyOxuxyidJg-","offsets":[182,17727,37602,54882,69440,89382,107277,121357,140995,155737,166980]},{"offsetcount":11,"id":"OBtxgocnAwKpDKkjPmZZTknn7oE-","sectors":185735,"offsets":[150,17905,37921,55370,70070,90160,108193,122421,142217,157098,168489]},{"sectors":184185,"id":"W8QmtEGl._hSOIBChZl14mTAsa0-","offsetcount":11,"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937]}],"format":"CD","trackcount":11,"position":1,"title":"","formatid":"9712d52a-4509-3d4b-a1a2-67c88c643e31"}],"releaseevents":[{"datum":"2000-02-08","area":{"typeid":null,"iso31661codes":["US"],"name":"United States","id":"489ce91b-6658-3307-9877-795b68554c98","disambiguation":"","type":null,"sortname":"United States"}}],"packagingid":"ec27701a-4a22-37f4-bfac-6616e0f9750a","title":"The Better Life","asin":"B00004C4QQ","textrepresentation":{"script":"Latn","language":"eng"},"statusid":"4e304316-386d-3409-af2e-78857eec5cfe","id":"717b5af5-3552-450e-8505-732872c2fe32","barcode":"601215392029","country":"US","disambiguation":"","packaging":"Jewel Case","coverartarchive":{"back":true,"count":5,"front":true,"artwork":true,"darkened":false}},{"coverartarchive":{"count":1,"back":false,"front":true,"artwork":true,"darkened":false},"packaging":null,"disambiguation":"","barcode":"601215392029","country":"GB","textrepresentation":{"script":"Latn","language":"eng"},"asin":"B00004C4QQ","statusid":"4e304316-386d-3409-af2e-78857eec5cfe","id":"39797c0e-b623-3d75-be9d-91791f660308","title":"The Better Life","packagingid":null,"releaseevents":[{"datum":"2000-09-18","area":{"id":"8a754a16-0027-3a29-b6d7-2b40ea0481ed","name":"United Kingdom","iso31661codes":["GB"],"typeid":null,"sortname":"United Kingdom","type":null,"disambiguation":""}}],"status":"Official","quality":"normal","media":[{"discs":[{"offsets":[150,17695,37555,54850,69407,89350,107230,121315,140962,155692,166937],"id":"2yeDPY5_bCqQjLWXRoKSw15NSNo-","offsetcount":11,"sectors":184035},{"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937],"sectors":184035,"offsetcount":11,"id":"CAzJSPfiE1bxRnDNI0iQwqfl_LY-"},{"id":"HSyom1OwaP3oIHbrMyOxuxyidJg-","offsetcount":11,"sectors":184062,"offsets":[182,17727,37602,54882,69440,89382,107277,121357,140995,155737,166980]},{"offsetcount":11,"id":"OBtxgocnAwKpDKkjPmZZTknn7oE-","sectors":185735,"offsets":[150,17905,37921,55370,70070,90160,108193,122421,142217,157098,168489]},{"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937],"id":"W8QmtEGl._hSOIBChZl14mTAsa0-","offsetcount":11,"sectors":184185}],"format":"CD","trackcount":11,"position":1,"title":"","formatid":"9712d52a-4509-3d4b-a1a2-67c88c643e31"}],"datum":"2000-09-18"},{"country":"DE","barcode":"601215392029","id":"55acdded-591e-36dd-bc40-15d5a07c0125","textrepresentation":{"script":"Latn","language":"eng"},"statusid":"4e304316-386d-3409-af2e-78857eec5cfe","asin":null,"title":"The Better Life","coverartarchive":{"count":3,"back":true,"front":true,"artwork":true,"darkened":false},"packaging":"Jewel Case","disambiguation":"","datum":"2000-09-11","packagingid":"ec27701a-4a22-37f4-bfac-6616e0f9750a","releaseevents":[{"datum":"2000-09-11","area":{"name":"Germany","id":"85752fda-13c4-31a3-bee5-0e5cb1f51dad","typeid":null,"iso31661codes":["DE"],"sortname":"Germany","disambiguation":"","type":null}}],"quality":"normal","media":[{"title":"","position":1,"formatid":"9712d52a-4509-3d4b-a1a2-67c88c643e31","trackcount":11,"format":"CD","discs":[{"offsets":[150,17695,37555,54850,69407,89350,107230,121315,140962,155692,166937],"offsetcount":11,"id":"2yeDPY5_bCqQjLWXRoKSw15NSNo-","sectors":184035},{"sectors":184035,"id":"CAzJSPfiE1bxRnDNI0iQwqfl_LY-","offsetcount":11,"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937]},{"offsetcount":11,"id":"HSyom1OwaP3oIHbrMyOxuxyidJg-","sectors":184062,"offsets":[182,17727,37602,54882,69440,89382,107277,121357,140995,155737,166980]},{"offsets":[150,17905,37921,55370,70070,90160,108193,122421,142217,157098,168489],"offsetcount":11,"id":"OBtxgocnAwKpDKkjPmZZTknn7oE-","sectors":185735},{"sectors":184185,"id":"W8QmtEGl._hSOIBChZl14mTAsa0-","offsetcount":11,"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937]},{"offsets":[150,17850,37863,55312,70023,90119,108153,122391,142191,157077,168476],"sectors":185577,"id":"wciuJa_ZuiT4STtw.ej0TTA0w4Y-","offsetcount":11}]}],"status":"Official"},{"disambiguation":"","packaging":null,"coverartarchive":{"front":true,"artwork":true,"darkened":false,"count":1,"back":false},"title":"The Better Life","id":"6e10b5fe-6d8a-3503-957c-9162969c9b73","statusid":"4e304316-386d-3409-af2e-78857eec5cfe","textrepresentation":{"language":"eng","script":"Latn"},"asin":"B00005GT8I","country":"JP","barcode":"4988067044556","quality":"normal","media":[{"format":"CD","discs":[{"offsets":[150,17695,37555,54850,69407,89350,107230,121315,140962,155692,166937],"id":"2yeDPY5_bCqQjLWXRoKSw15NSNo-","offsetcount":11,"sectors":184035},{"id":"CAzJSPfiE1bxRnDNI0iQwqfl_LY-","offsetcount":11,"sectors":184035,"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937]},{"offsets":[182,17727,37602,54882,69440,89382,107277,121357,140995,155737,166980],"offsetcount":11,"id":"HSyom1OwaP3oIHbrMyOxuxyidJg-","sectors":184062},{"offsets":[150,17905,37921,55370,70070,90160,108193,122421,142217,157098,168489],"id":"OBtxgocnAwKpDKkjPmZZTknn7oE-","offsetcount":11,"sectors":185735},{"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937],"id":"W8QmtEGl._hSOIBChZl14mTAsa0-","offsetcount":11,"sectors":184185}],"trackcount":11,"title":"","position":1,"formatid":"9712d52a-4509-3d4b-a1a2-67c88c643e31"}],"status":"Official","releaseevents":[{"datum":"2000-06-28","area":{"name":"Japan","id":"2db42837-c832-3c27-b4a3-08198f75693c","typeid":null,"iso31661codes":["JP"],"sortname":"Japan","type":null,"disambiguation":""}}],"packagingid":null,"datum":"2000-06-28"},{"packagingid":null,"releaseevents":[{"area":{"sortname":"Europe","disambiguation":"","type":null,"name":"Europe","id":"89a675c2-3e37-3518-b83c-418bad59a85a","typeid":null,"iso31661codes":["XE"]},"datum":"2001-06-13"}],"status":"Official","media":[{"trackcount":11,"discs":[{"offsetcount":11,"id":"2yeDPY5_bCqQjLWXRoKSw15NSNo-","sectors":184035,"offsets":[150,17695,37555,54850,69407,89350,107230,121315,140962,155692,166937]},{"sectors":184035,"id":"CAzJSPfiE1bxRnDNI0iQwqfl_LY-","offsetcount":11,"offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937]},{"offsets":[182,17727,37602,54882,69440,89382,107277,121357,140995,155737,166980],"sectors":184062,"id":"HSyom1OwaP3oIHbrMyOxuxyidJg-","offsetcount":11},{"offsets":[150,17905,37921,55370,70070,90160,108193,122421,142217,157098,168489],"sectors":185735,"offsetcount":11,"id":"OBtxgocnAwKpDKkjPmZZTknn7oE-"},{"sectors":184185,"offsetcount":11,"id":"W8QmtEGl._hSOIBChZl14mTAsa0-","offsets":[150,17687,37555,54855,69407,89350,107235,121315,140962,155695,166937]}],"format":"CD","formatid":"9712d52a-4509-3d4b-a1a2-67c88c643e31","position":1,"title":""},{"formatid":"8a08dc62-1aa2-34de-a904-fa467c53052c","title":"Bonus Disc","position":2,"trackcount":5,"format":"Enhanced CD","discs":[{"sectors":92060,"id":"tVNbsuVZyiciUmaWoEIQwJFf7Zo-","offsetcount":5,"offsets":[150,23225,40820,54902,72100]}]}],"quality":"normal","datum":"2001-06-13","coverartarchive":{"darkened":false,"artwork":true,"front":true,"back":false,"count":1},"packaging":null,"disambiguation":"Bonus Disc Edition","barcode":"044001445422","country":"XE","asin":null,"textrepresentation":{"language":"eng","script":"Latn"},"statusid":"4e304316-386d-3409-af2e-78857eec5cfe","id":"48bb1fd9-a45c-3fc6-aca7-075d1ef08f5c","title":"The Better Life"},{"datum":"2000","status":"Official","media":[{"format":"CD","discs":[{"offsets":[150,17695,37555,54850,69407,89350,107230,121315,140962,155692,166937],"sectors":184035,"offsetcount":11,"id":"2yeDPY5_bCqQjLWXRoKSw15NSNo-"}],"trackcount":11,"formatid":"9712d52a-4509-3d4b-a1a2-67c88c643e31","title":"","position":1}],"quality":"normal","packagingid":"ec27701a-4a22-37f4-bfac-6616e0f9750a","releaseevents":[{"datum":"2000","area":{"id":"71bbafaa-e825-3e15-8ca9-017dcad1748b","name":"Canada","iso31661codes":["CA"],"typeid":null,"sortname":"Canada","disambiguation":"","type":null}}],"title":"The Better Life","barcode":"601215392029","country":"CA","statusid":"4e304316-386d-3409-af2e-78857eec5cfe","textrepresentation":{"language":"eng","script":"Latn"},"asin":null,"id":"234bbb67-dc25-4114-90cc-b0a7fdc47fa0","disambiguation":"","coverartarchive":{"darkened":false,"front":true,"artwork":true,"back":true,"count":2},"packaging":"Jewel Case"}],"offsets":[150,17695,37555,54850,69407,89350,107230,121315,140962,155692,166937]}


    Jetzt sind ja einige der Properties nicht VB-konform und wurden daher vom Konverter abgeändert, z.B. die erste ist:

    VB.NET-Quellcode

    1. '<JsonProperty("sort-name")>
    2. Public Property sortname As String


    Also hab ich mir gedacht ich ersetze alle diese Propertynamen mit der korrigierten Version schon vor dem Deserialisieren im JSON-String mit dieser Funktion:

    VB.NET-Quellcode

    1. Private Function CorrectPropertyNames(argJSON As String) As String
    2. Dim Result As String = argJSON
    3. Result = Result.Replace("sort-name", "sortname")
    4. Result = Result.Replace("iso-3166-1-codes", "iso31661codes")
    5. Result = Result.Replace("type-id", "typeid")
    6. Result = Result.Replace("offset-count", "offsetcount")
    7. Result = Result.Replace("format-id", "formatid")
    8. Result = Result.Replace("track-count", "trackcount")
    9. Result = Result.Replace("packaging-id", "packagingid")
    10. Result = Result.Replace("text-representation", "textrepresentation")
    11. Result = Result.Replace("date", "datum")
    12. Result = Result.Replace("status-id", "statusid")
    13. Result = Result.Replace("release-events", "releaseevents")
    14. Result = Result.Replace("cover-art-archive", "coverartarchive")
    15. Return Result
    16. End Function


    Ich bekomme aber immer noch diesen Fehler.

    Weiss jemand woran das liegt oder sieht einen offensichtlichen Fehler, bzw. kann man diese Korrektur dieser Propertynames irgendwie automatisieren?

    Ich deserialisiere folgendermassen:

    VB.NET-Quellcode

    1. Dim ResultAlbumSearch As String = Klient.DownloadString(AlbumSearchURL)
    2. ResultAlbumSearch = KorrigierePropertyNames(ResultAlbumSearch)
    3. Dim AlbumObjekt As New MusicBrainzAlbumData.Root
    4. AlbumObjekt = CType(JsonConvert.DeserializeObject(ResultAlbumSearch), MusicBrainzAlbumData.Root)


    Grüsse, kafffee

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

    Bevor du dir da jetzt den Kopf zerbrichst und versuchst, das auf Krampf in C# zu übersetzen: erstell eine C#-Klassenbibliothek und lade dort deine Klassen rein.
    Die kannst du problemlos in deinem VB-Projekt referenzieren und verwenden.

    EDIT:
    Ich will nicht sagen, dass du dir die Mühe gar nicht machen sollst, aber manchmal ist es sinnvoller, den Einfachen Weg zu nehmen, bevor man sich unnötig den Kopf zerbricht :)
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Im Hintergrund ist das alles MSIL. Die ganzen System-Libs die du verwendest, sind auch in C# geschrieben
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Wie steige ich denn da ein beim Erstellen der Klassenbibliothek?

    Windows-Forms-Klasssenbibliothek?

    Wie bekomme ich dann die Form1 aus dem Projekt?

    Edit @siycah:
    Gibts da überhaupt ein Template für Framework 4.8?

    Edit2 @siycah
    Ah habs hinbekommen. Leeres Projekt und dann in den Anwendungseigenschaften Ausgabetyp Klassenbibliothek...

    Aber diese besagten Eigenschaften werden von IntelliSense trotzdem rot angestrichen. Lag wohl nicht daran, dass das nicht VB-konform ist :(

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

    C#-Quellcode

    1. public class Foo {
    2. [JsonProperty("something_in_json")]
    3. public int Bar { get; set; }
    4. }


    So wäre aber die valide Syntax in C#.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Okay ein Imports Newtonsoft.Json in meiner Datenklasse kann natürlich nicht schaden... :P

    Ich dachte dass hier wäre nur eine Art Gedankenstütze für den Programmierer, sah mir nicht wie Syntax aus:

    VB.NET-Quellcode

    1. <JsonProperty("text-representation")>
    2. Public Property textrepresentation As TextRepresentation


    Jetzt scheint alles in Ordnung zu sein, ich bekomm aber immer noch diesen Fehler...

    Da ist natürlich noch diese Property, die nicht gehen kann, weil date ein Schlüsselwort ist....

    Public Property date As String

    Ich hab beides versucht, einmal auskommentieren (diese Property brauche ich eigentlich nicht) und einmal im Original-JSON ersetzt:

    Result = Result.Replace("date", "datum") und den Prooertynamen entsprechend geändert, funktioniert aber beides nicht...

    Hat jemand ne Idee, wie ich anfangen kann das zu debuggen? Wichtig zu wissen wäre vielleicht noch, bevor wir uns hier einen abbrechen, dass ich nur die Property id As String aus der Class Release brauche, alles Andere ist erstmal für die Tonne...

    @Fakiz
    Hab deinen Link grad mal überflogen, scheint aber bloss Sinn zu machen, wenn ich die Daten auch Serialisiere. Leider hab ich bei meinem Problem keinen Einfluss auf den serialisierten JSON String, der ist so wie er ist, gegeben...
    @ErfinderDesRades

    Hab jetzt [date] gemacht, weil im Original ist es auch kleingeschrieben...Ist das in deinem Sinne?

    Immer noch der gleiche Fehler :( aber gut zu wissen dieser Kniff :)

    ErfinderDesRades schrieb:

    Und Date ist kein Schlüsselwort, sondern ein Datentyp
    /klugscheiss

    Ja aber der Datentyp ist doch da an sich auch wieder ein Schlüselwort ?? /klugscheiss 2.0 :thumbsup:

    kafffee schrieb:

    Und Date ist kein Schlüsselwort, sondern ein Datentyp


    Ich bin erschrocken. Das ist ja tatsächlich ein VB-Keyword

    kafffee schrieb:

    Ja aber der Datentyp ist doch da an sich auch wieder ein Schlüselwort ?? /klugscheiss 2.0


    In MSIL-Sprachen ist sowieso alles ein Object. Also macht es keinen Unterschied - Datentyp = Object.

    kafffee schrieb:

    Hab jetzt [date] gemacht, weil im Original ist es auch kleingeschrieben...Ist das in deinem Sinne?

    Lt. Microsoft Coding-Guideline sollen alle öffentlichen Eigenschaften großgeschrieben werden. ​Public Property [Date] As String wäre hier also richtig.

    kafffee schrieb:

    Hab deinen Link grad mal überflogen, scheint aber bloss Sinn zu machen, wenn ich die Daten auch Serialisiere.


    Das ist für genau solche Fälle, wenn man sich an einen bestimmten Vertrag (API) halten muss. Völlig egal, ob du Daten serialisierst, oder deserialisierst.
    Da würde ich auch nach wie vor nicht an dem JSON rumfuhrwerken und händisch was ändern, solange es nicht absolut zwingend notwendig ist.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    kafffee schrieb:

    Ja aber der Datentyp ist doch da an sich auch wieder ein Schlüselwort ?
    Also wies mir aussieht, haben sie für viele Datentypen Extra-Schlüsselworte eingeführt:
    learn.microsoft.com/en-us/dotn…guage-reference/keywords/

    Der Grund wird sein, dass sie Verwirrung schaffen wollten, und verhindern, dass Vb.Net-Programmierer den Unterschied von Datentyp und Schlüsselwort verstehen.

    ErfinderDesRades schrieb:

    Der Grund wird sein, dass sie Verwirrung schaffen wollten, also verhindern, dass Vb.Net-Programmierer den Unterschied von Datentyp und Schlüsselwort verstehen.


    Da kannst drauf wetten. Das ist ja maximal verwirrend, was die da angestellt haben. Die Sprache ist so umfassend geworden, dass sie komplexer ist, als C++, was Schlüsselwörter angeht.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    ErfinderDesRades schrieb:

    Der Grund wird sein, dass sie Verwirrung schaffen wollten, und verhindern, dass Vb.Net-Programmierer den Unterschied von Datentyp und Schlüsselwort verstehen.


    Ja, schon oft gedacht, nie ausgesprochen lol. Aber mal zurück zum Thema:

    Was schlagt ihr vor, was ich jetzt mache?

    Hab das Demoprojekt mal angehängt, vielleicht suchen wir an der falschen Stelle?? Evtl. müsst ihr den Verweis auf die bass.Net. Dll noch rausnehmen
    Dateien

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

    Ich konnte das Projekt bei mir gar nicht bauen, weil ich dotnet 4 nicht installiert habe (und ich war jetzt ehrlich gesagt zu faul, das alles in ein neues Projekt zu basteln).

    Es gibt ein cooles Tool, das heißt QuickType. Damit kannst du jegliches JSON in eine von vielen Sprachen übersetzen.
    Daraus resultiert folgende Datei:

    Spoiler anzeigen

    C#-Quellcode

    1. // <auto-generated />
    2. //
    3. // To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
    4. //
    5. // using QuickType;
    6. //
    7. // var musicBrainz = MusicBrainz.FromJson(jsonString);
    8. namespace QuickType
    9. {
    10. using System;
    11. using System.Collections.Generic;
    12. using System.Globalization;
    13. using Newtonsoft.Json;
    14. using Newtonsoft.Json.Converters;
    15. public partial class Media
    16. {
    17. [JsonProperty("format")]
    18. public string Format { get; set; }
    19. [JsonProperty("discs")]
    20. public List<MusicBrainz> Discs { get; set; }
    21. [JsonProperty("position")]
    22. public long Position { get; set; }
    23. [JsonProperty("format-id")]
    24. public Guid FormatId { get; set; }
    25. [JsonProperty("title")]
    26. public string Title { get; set; }
    27. [JsonProperty("track-count")]
    28. public long TrackCount { get; set; }
    29. }
    30. public partial class Release
    31. {
    32. [JsonProperty("country")]
    33. public string Country { get; set; }
    34. [JsonProperty("quality")]
    35. public string Quality { get; set; }
    36. [JsonProperty("date")]
    37. public Date DateObject { get; set; }
    38. [JsonProperty("status-id")]
    39. public Guid StatusId { get; set; }
    40. [JsonProperty("barcode")]
    41. public string Barcode { get; set; }
    42. [JsonProperty("packaging")]
    43. public string Packaging { get; set; }
    44. [JsonProperty("id")]
    45. public Guid Id { get; set; }
    46. [JsonProperty("cover-art-archive")]
    47. public CoverArtArchive CoverArtArchive { get; set; }
    48. [JsonProperty("title")]
    49. public string Title { get; set; }
    50. [JsonProperty("asin")]
    51. public string Asin { get; set; }
    52. [JsonProperty("release-events")]
    53. public List<ReleaseEvent> ReleaseEvents { get; set; }
    54. [JsonProperty("status")]
    55. public string Status { get; set; }
    56. [JsonProperty("disambiguation")]
    57. public string Disambiguation { get; set; }
    58. [JsonProperty("media")]
    59. public List<Media> Media { get; set; }
    60. [JsonProperty("packaging-id")]
    61. public Guid? PackagingId { get; set; }
    62. [JsonProperty("text-representation")]
    63. public TextRepresentation TextRepresentation { get; set; }
    64. }
    65. public partial class MusicBrainz
    66. {
    67. [JsonProperty("releases", NullValueHandling = NullValueHandling.Ignore)]
    68. public List<Release> Releases { get; set; }
    69. [JsonProperty("offsets")]
    70. public List<long> Offsets { get; set; }
    71. [JsonProperty("id")]
    72. public string Id { get; set; }
    73. [JsonProperty("sectors")]
    74. public long Sectors { get; set; }
    75. [JsonProperty("offset-count")]
    76. public long OffsetCount { get; set; }
    77. }
    78. public partial class CoverArtArchive
    79. {
    80. [JsonProperty("front")]
    81. public bool Front { get; set; }
    82. [JsonProperty("artwork")]
    83. public bool Artwork { get; set; }
    84. [JsonProperty("count")]
    85. public long Count { get; set; }
    86. [JsonProperty("back")]
    87. public bool Back { get; set; }
    88. [JsonProperty("darkened")]
    89. public bool Darkened { get; set; }
    90. }
    91. public partial class ReleaseEvent
    92. {
    93. [JsonProperty("date")]
    94. public Date Date { get; set; }
    95. [JsonProperty("area")]
    96. public Area Area { get; set; }
    97. }
    98. public partial class Area
    99. {
    100. [JsonProperty("name")]
    101. public string Name { get; set; }
    102. [JsonProperty("id")]
    103. public Guid Id { get; set; }
    104. [JsonProperty("type")]
    105. public object Type { get; set; }
    106. [JsonProperty("sort-name")]
    107. public string SortName { get; set; }
    108. [JsonProperty("iso-3166-1-codes")]
    109. public List<string> Iso31661Codes { get; set; }
    110. [JsonProperty("disambiguation")]
    111. public string Disambiguation { get; set; }
    112. [JsonProperty("type-id")]
    113. public object TypeId { get; set; }
    114. }
    115. public partial class TextRepresentation
    116. {
    117. [JsonProperty("language")]
    118. public string Language { get; set; }
    119. [JsonProperty("script")]
    120. public string Script { get; set; }
    121. }
    122. public partial struct Date
    123. {
    124. public DateTimeOffset? DateTime;
    125. public long? Integer;
    126. public static implicit operator Date(DateTimeOffset DateTime) => new Date { DateTime = DateTime };
    127. public static implicit operator Date(long Integer) => new Date { Integer = Integer };
    128. }
    129. public partial class MusicBrainz
    130. {
    131. public static MusicBrainz FromJson(string json) => JsonConvert.DeserializeObject<MusicBrainz>(json, QuickType.Converter.Settings);
    132. }
    133. public static class Serialize
    134. {
    135. public static string ToJson(this MusicBrainz self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
    136. }
    137. internal static class Converter
    138. {
    139. public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    140. {
    141. MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
    142. DateParseHandling = DateParseHandling.None,
    143. Converters =
    144. {
    145. DateConverter.Singleton,
    146. new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
    147. },
    148. };
    149. }
    150. internal class DateConverter : JsonConverter
    151. {
    152. public override bool CanConvert(Type t) => t == typeof(Date) || t == typeof(Date?);
    153. public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
    154. {
    155. switch (reader.TokenType)
    156. {
    157. case JsonToken.String:
    158. case JsonToken.Date:
    159. var stringValue = serializer.Deserialize<string>(reader);
    160. DateTimeOffset dt;
    161. if (DateTimeOffset.TryParse(stringValue, out dt))
    162. {
    163. return new Date { DateTime = dt };
    164. }
    165. long l;
    166. if (Int64.TryParse(stringValue, out l))
    167. {
    168. return new Date { Integer = l };
    169. }
    170. break;
    171. }
    172. throw new Exception("Cannot unmarshal type Date");
    173. }
    174. public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
    175. {
    176. var value = (Date)untypedValue;
    177. if (value.DateTime != null)
    178. {
    179. serializer.Serialize(writer, value.DateTime.Value.ToString("o", System.Globalization.CultureInfo.InvariantCulture));
    180. return;
    181. }
    182. if (value.Integer != null)
    183. {
    184. serializer.Serialize(writer, value.Integer.Value.ToString());
    185. return;
    186. }
    187. throw new Exception("Cannot marshal type Date");
    188. }
    189. public static readonly DateConverter Singleton = new DateConverter();
    190. }
    191. }



    Das übernimmt die Serialisierung und Deserialisierung für dich und wandelt auch gleich alle Namen entsprechend der Microsoft Coding Conventions.
    Der verwendet auch einige komplexere Strukturen, die es scheinbar in VB nicht gibt.

    Du kannst die Klasse nehmen, in eine Bibliothek einpacken und dann aus deinem Projekt referenzieren. Schau mal ob das klappt.

    Falls du selber QuickType nutzen möchtest, kannst du das unter quicktype.io.

    Edit: Ich habe das "Date" Property mal zu "DateObject" umbenannt, damit du in VB auch nicht unnötig fummeln musst.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @siycah

    Super danke für den Link habs erstmal hinbekommen. Sehr hilfreich.

    Jetzt muss ich in diesem Fall noch eine zweite Query machen, mit dem Ergebnis der ersten in der Request URI. Hab ich auch hinbekommen, auch das Deserialisieren.

    Bloss komm ich jetzt nach zwei Stunden überlegen und probieren nicht an die gewünschten Daten, hab da irgendwo nen Denkfehler drin. Ich bin mir aber fast sicher, dass ich nicht Dim AlbumContentObject As AlbumSearchContentData.Media machen muss, sondern Dim AlbumContentObject As List(Of AlbumSearchContentData.Media). Bloss da komm ich nicht dahinter, wie die Syntax ist, wenn man das Deserialisieren möchte.

    Ich deserialisiere momentan so:

    VB.NET-Quellcode

    1. Dim AlbumContentObject As AlbumSearchContentData.Media = AlbumSearchContentData.Media.FromJson(ResultAlbumContentSearch)
    2. For Each item In AlbumContentObject.Tracks
    3. Console.WriteLine(item.Position & ". " & item.Title)
    4. Next


    Ich möchte, dass er mir die Tracknummern (.Position) und die Tracktitel (.Title) ausgibt. Leider ist AlbumContentObject.Tracks,.ount immer 0, was nicht sein kann. Irgendwas mach ich falsch.

    So sieht das JSON aus (im Screenshot JSON.PNG sieht mans vielleicht etwas besser):

    Spoiler anzeigen
    {
    "asin": "B00004C4QQ",
    "status-id": "4e304316-386d-3409-af2e-78857eec5cfe",
    "packaging": "Jewel Case",
    "packaging-id": "ec27701a-4a22-37f4-bfac-6616e0f9750a",
    "title": "The Better Life",
    "country": "US",
    "quality": "normal",
    "date": "2000-02-08",
    "disambiguation": "",
    "cover-art-archive": {
    "darkened": false,
    "artwork": true,
    "back": true,
    "front": true,
    "count": 5
    },
    "status": "Official",
    "barcode": "601215392029",
    "text-representation": {
    "language": "eng",
    "script": "Latn"
    },
    "media": [
    {
    "tracks": [
    {
    "recording": {
    "length": 234466,
    "disambiguation": "",
    "first-release-date": "1997",
    "id": "f5f6068d-b660-4be3-a8aa-81c55c16d687",
    "video": false,
    "title": "Kryptonite"
    },
    "id": "80b869b5-0982-3bde-bfd4-6481553822da",
    "number": "1",
    "title": "Kryptonite",
    "position": 1,
    "length": 233826
    },
    {
    "position": 2,
    "title": "Loser",
    "length": 264906,
    "recording": {
    "id": "cd17be88-1fb4-4eeb-9ce0-8bc701f59f84",
    "title": "Loser",
    "video": false,
    "length": 264906,
    "disambiguation": "",
    "first-release-date": "2000-02-08"
    },
    "id": "8c28c3d9-8a65-32d2-87eb-cdea81e5d87d",
    "number": "2"
    },
    {
    "recording": {
    "video": false,
    "title": "Duck and Run",
    "id": "2f18e47e-c73a-4b01-a747-10709f3f2368",
    "first-release-date": "2000-02-08",
    "disambiguation": "",
    "length": 230666
    },
    "id": "1501daa9-be0f-38a3-82c5-642ce9ff3d96",
    "number": "3",
    "title": "Duck and Run",
    "position": 3,
    "length": 230666
    },
    {
    "recording": {
    "disambiguation": "",
    "length": 194026,
    "first-release-date": "2000-02-08",
    "id": "8dad9e5c-614e-4d03-ae5c-2eb3a5ae72c8",
    "title": "Not Enough",
    "video": false
    },
    "id": "ce7fb2d3-d10d-3ac6-b8d1-2d9a44b5a9be",
    "number": "4",
    "title": "Not Enough",
    "position": 4,
    "length": 194026
    },
    {
    "length": 265906,
    "position": 5,
    "title": "Be Like That",
    "number": "5",
    "recording": {
    "id": "1e7a3b6f-c3a4-458e-a962-f1e7de2babc6",
    "title": "Be Like That",
    "video": false,
    "length": 265906,
    "disambiguation": "",
    "first-release-date": "2000-02-08"
    },
    "id": "092746d8-b763-3d7b-8570-dc86bbe31779"
    },
    {
    "length": 238466,
    "position": 6,
    "title": "Life of My Own",
    "number": "6",
    "id": "4fafc39b-5814-318d-828a-61fb2fe40bec",
    "recording": {
    "title": "Life of My Own",
    "video": false,
    "id": "eb21b7f9-45d1-4aea-b4b1-2fe48fe93551",
    "first-release-date": "2000-02-08",
    "length": 238466,
    "disambiguation": ""
    }
    },
    {
    "number": "7",
    "recording": {
    "first-release-date": "2000-02-08",
    "disambiguation": "",
    "length": 187733,
    "video": false,
    "title": "The Better Life",
    "id": "7e14e524-409d-4bef-8498-8f9a93a4470a"
    },
    "id": "dd147282-6dc7-3654-a6c2-54e66e60341e",
    "length": 187733,
    "position": 7,
    "title": "Better Life"
    },
    {
    "title": "Down Poison",
    "position": 8,
    "length": 261959,
    "recording": {
    "video": false,
    "title": "Down Poison",
    "id": "daa90b33-d188-4a9a-9540-4949cf11a1c8",
    "first-release-date": "2000-02-08",
    "disambiguation": "",
    "length": 261959
    },
    "id": "83836713-db6f-3d83-9c9e-f3295ea28817",
    "number": "8"
    },
    {
    "recording": {
    "id": "1fe7d77f-1b49-4802-ba6b-6a54fbe73dba",
    "title": "By My Side",
    "video": false,
    "disambiguation": "",
    "length": 196440,
    "first-release-date": "1997"
    },
    "id": "ee8eda7f-e3b2-3221-9309-38b7e4311a5a",
    "number": "9",
    "position": 9,
    "title": "By My Side",
    "length": 196440
    },
    {
    "title": "Smack",
    "position": 10,
    "length": 149893,
    "recording": {
    "title": "Smack",
    "video": false,
    "id": "c214e53b-44ce-4d30-8b1c-1163faab16c4",
    "first-release-date": "1997",
    "length": 149893,
    "disambiguation": ""
    },
    "id": "da112b1f-2c95-31b2-97b5-e5ef3ac2127e",
    "number": "10"
    },
    {
    "length": 227973,
    "title": "So I Need You",
    "position": 11,
    "number": "11",
    "id": "729ff684-7f9f-3197-938e-503360e9ff6e",
    "recording": {
    "first-release-date": "2000-02-08",
    "length": 227973,
    "disambiguation": "",
    "title": "So I Need You",
    "video": false,
    "id": "deb3bc5c-e635-46ed-9131-2c3bb71e7bd0"
    }
    }
    ],
    "title": "",
    "position": 1,
    "format-id": "9712d52a-4509-3d4b-a1a2-67c88c643e31",
    "track-count": 11,
    "format": "CD",
    "track-offset": 0
    }
    ],
    "release-events": [
    {
    "area": {
    "type": null,
    "name": "United States",
    "sort-name": "United States",
    "id": "489ce91b-6658-3307-9877-795b68554c98",
    "disambiguation": "",
    "iso-3166-1-codes": [
    "US"
    ],
    "type-id": null
    },
    "date": "2000-02-08"
    }
    ],
    "id": "717b5af5-3552-450e-8505-732872c2fe32"
    }


    So sieht meine Datenklasse(n) aus:

    Spoiler anzeigen

    C#-Quellcode

    1. // <auto-generated />
    2. //
    3. // To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
    4. //
    5. // using QuickType;
    6. //
    7. // var welcome = Welcome.FromJson(jsonString);
    8. namespace AlbumSearchContentData
    9. {
    10. using System;
    11. using System.Collections.Generic;
    12. using System.Globalization;
    13. using Newtonsoft.Json;
    14. using Newtonsoft.Json.Converters;
    15. public partial class Welcome
    16. {
    17. [JsonProperty("date")]
    18. public DateTimeOffset Date { get; set; }
    19. [JsonProperty("packaging-id")]
    20. public Guid PackagingId { get; set; }
    21. [JsonProperty("release-events")]
    22. public ReleaseEvent[] ReleaseEvents { get; set; }
    23. [JsonProperty("quality")]
    24. public string Quality { get; set; }
    25. [JsonProperty("media")]
    26. public Media[] Media { get; set; }
    27. [JsonProperty("status")]
    28. public string Status { get; set; }
    29. [JsonProperty("country")]
    30. public string Country { get; set; }
    31. [JsonProperty("barcode")]
    32. public string Barcode { get; set; }
    33. [JsonProperty("id")]
    34. public Guid Id { get; set; }
    35. [JsonProperty("text-representation")]
    36. public TextRepresentation TextRepresentation { get; set; }
    37. [JsonProperty("asin")]
    38. public string Asin { get; set; }
    39. [JsonProperty("status-id")]
    40. public Guid StatusId { get; set; }
    41. [JsonProperty("title")]
    42. public string Title { get; set; }
    43. [JsonProperty("cover-art-archive")]
    44. public CoverArtArchive CoverArtArchive { get; set; }
    45. [JsonProperty("packaging")]
    46. public string Packaging { get; set; }
    47. [JsonProperty("disambiguation")]
    48. public string Disambiguation { get; set; }
    49. }
    50. public partial class CoverArtArchive
    51. {
    52. [JsonProperty("back")]
    53. public bool Back { get; set; }
    54. [JsonProperty("count")]
    55. public long Count { get; set; }
    56. [JsonProperty("front")]
    57. public bool Front { get; set; }
    58. [JsonProperty("artwork")]
    59. public bool Artwork { get; set; }
    60. [JsonProperty("darkened")]
    61. public bool Darkened { get; set; }
    62. }
    63. public partial class Media
    64. {
    65. [JsonProperty("track-count")]
    66. public long TrackCount { get; set; }
    67. [JsonProperty("tracks")]
    68. public Track[] Tracks { get; set; }
    69. [JsonProperty("track-offset")]
    70. public long TrackOffset { get; set; }
    71. [JsonProperty("format")]
    72. public string Format { get; set; }
    73. [JsonProperty("title")]
    74. public string Title { get; set; }
    75. [JsonProperty("position")]
    76. public long Position { get; set; }
    77. [JsonProperty("format-id")]
    78. public Guid FormatId { get; set; }
    79. }
    80. public partial class Track
    81. {
    82. [JsonProperty("recording")]
    83. public Recording Recording { get; set; }
    84. [JsonProperty("length")]
    85. public long Length { get; set; }
    86. [JsonProperty("id")]
    87. public Guid Id { get; set; }
    88. [JsonProperty("title")]
    89. public string Title { get; set; }
    90. [JsonProperty("number")]
    91. [JsonConverter(typeof(ParseStringConverter))]
    92. public long Number { get; set; }
    93. [JsonProperty("position")]
    94. public long Position { get; set; }
    95. }
    96. public partial class Recording
    97. {
    98. [JsonProperty("first-release-date")]
    99. public FirstReleaseDate FirstReleaseDate { get; set; }
    100. [JsonProperty("disambiguation")]
    101. public string Disambiguation { get; set; }
    102. [JsonProperty("video")]
    103. public bool Video { get; set; }
    104. [JsonProperty("length")]
    105. public long Length { get; set; }
    106. [JsonProperty("id")]
    107. public Guid Id { get; set; }
    108. [JsonProperty("title")]
    109. public string Title { get; set; }
    110. }
    111. public partial class ReleaseEvent
    112. {
    113. [JsonProperty("date")]
    114. public DateTimeOffset Date { get; set; }
    115. [JsonProperty("area")]
    116. public Area Area { get; set; }
    117. }
    118. public partial class Area
    119. {
    120. [JsonProperty("sort-name")]
    121. public string SortName { get; set; }
    122. [JsonProperty("disambiguation")]
    123. public string Disambiguation { get; set; }
    124. [JsonProperty("type")]
    125. public object Type { get; set; }
    126. [JsonProperty("id")]
    127. public Guid Id { get; set; }
    128. [JsonProperty("name")]
    129. public string Name { get; set; }
    130. [JsonProperty("iso-3166-1-codes")]
    131. public string[] Iso31661Codes { get; set; }
    132. [JsonProperty("type-id")]
    133. public object TypeId { get; set; }
    134. }
    135. public partial class TextRepresentation
    136. {
    137. [JsonProperty("language")]
    138. public string Language { get; set; }
    139. [JsonProperty("script")]
    140. public string Script { get; set; }
    141. }
    142. public partial struct FirstReleaseDate
    143. {
    144. public DateTimeOffset? DateTime;
    145. public long? Integer;
    146. public static implicit operator FirstReleaseDate(DateTimeOffset DateTime) => new FirstReleaseDate { DateTime = DateTime };
    147. public static implicit operator FirstReleaseDate(long Integer) => new FirstReleaseDate { Integer = Integer };
    148. }
    149. public partial class Media
    150. {
    151. public static Media FromJson(string json) => JsonConvert.DeserializeObject<Media>(json, AlbumSearchContentData.Converter.Settings);
    152. }
    153. public partial class Welcome
    154. {
    155. public static Welcome FromJson(string json) => JsonConvert.DeserializeObject<Welcome>(json, AlbumSearchData.Converter.Settings);
    156. }
    157. public static class Serialize
    158. {
    159. public static string ToJson(this Welcome self) => JsonConvert.SerializeObject(self, AlbumSearchData.Converter.Settings);
    160. }
    161. internal static class Converter
    162. {
    163. public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    164. {
    165. MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
    166. DateParseHandling = DateParseHandling.None,
    167. Converters =
    168. {
    169. FirstReleaseDateConverter.Singleton,
    170. new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
    171. },
    172. };
    173. }
    174. internal class ParseStringConverter : JsonConverter
    175. {
    176. public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
    177. public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
    178. {
    179. if (reader.TokenType == JsonToken.Null) return null;
    180. var value = serializer.Deserialize<string>(reader);
    181. long l;
    182. if (Int64.TryParse(value, out l))
    183. {
    184. return l;
    185. }
    186. throw new Exception("Cannot unmarshal type long");
    187. }
    188. public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
    189. {
    190. if (untypedValue == null)
    191. {
    192. serializer.Serialize(writer, null);
    193. return;
    194. }
    195. var value = (long)untypedValue;
    196. serializer.Serialize(writer, value.ToString());
    197. return;
    198. }
    199. public static readonly ParseStringConverter Singleton = new ParseStringConverter();
    200. }
    201. internal class FirstReleaseDateConverter : JsonConverter
    202. {
    203. public override bool CanConvert(Type t) => t == typeof(FirstReleaseDate) || t == typeof(FirstReleaseDate?);
    204. public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
    205. {
    206. switch (reader.TokenType)
    207. {
    208. case JsonToken.String:
    209. case JsonToken.Date:
    210. var stringValue = serializer.Deserialize<string>(reader);
    211. DateTimeOffset dt;
    212. if (DateTimeOffset.TryParse(stringValue, out dt))
    213. {
    214. return new FirstReleaseDate { DateTime = dt };
    215. }
    216. long l;
    217. if (Int64.TryParse(stringValue, out l))
    218. {
    219. return new FirstReleaseDate { Integer = l };
    220. }
    221. break;
    222. }
    223. throw new Exception("Cannot unmarshal type FirstReleaseDate");
    224. }
    225. public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
    226. {
    227. var value = (FirstReleaseDate)untypedValue;
    228. if (value.DateTime != null)
    229. {
    230. serializer.Serialize(writer, value.DateTime.Value.ToString("o", System.Globalization.CultureInfo.InvariantCulture));
    231. return;
    232. }
    233. if (value.Integer != null)
    234. {
    235. serializer.Serialize(writer, value.Integer.Value.ToString());
    236. return;
    237. }
    238. throw new Exception("Cannot marshal type FirstReleaseDate");
    239. }
    240. public static readonly FirstReleaseDateConverter Singleton = new FirstReleaseDateConverter();
    241. }
    242. }


    Edit @siycah

    Okay Dummheit tut weh, ich glaub ich habs, hätte bloss mal den Kommentar in der automatisch generierten Datenklasse ganz oben lesen müssen.
    Dim AlbumContentObject As AlbumSearchContentData.Welcome = AlbumSearchContentData.Welcome.FromJson(ResultAlbumContentSearch)

    Noch kurz Datentypen FirstReleaseDates und Guid durch String ersetzt, jetzt kommt zumindest mal kein Fehler...

    Jetzt gibt er mir zwar .Position aus, aber nicht .Title...

    Edit2 @siycah:
    Auch das hab ich hinbekommen:

    VB.NET-Quellcode

    1. For Each item In AlbumContentObject.Media(0).Tracks
    2. Console.WriteLine(item.Position & ". " & item.Title)
    3. Next


    Edit3 @siycah
    Doch ein Problem muss ich nachschieben: Jetzt sagt er:

    Die Zeichenfolge wurde nicht als gültiges DateTime erkannt.

    Einfach Typ in String umwandeln ist hier glaub nicht, in der Datenklassse ist z.B. das hier (unter leider sehr vielen Vorkommen, ich weiss nicht genau wo er das anmeckert):

    C#-Quellcode

    1. public partial struct FirstReleaseDate
    2. {
    3. public DateTimeOffset? DateTime;
    4. public long? Integer;
    5. public static implicit operator FirstReleaseDate(DateTimeOffset DateTime) => new FirstReleaseDate { DateTime = DateTime };
    6. public static implicit operator FirstReleaseDate(long Integer) => new FirstReleaseDate { Integer = Integer };
    7. }


    Kann man da vielleicht irgendwas an der DateTime-Formatierung ändern, ich glaube das Problem liegt daran, dass im JSON das amerikanische Datumsformat ausgegeben wird... YYYY-MM-DD oder so...


    Bilder
    • JSON.PNG

      41,81 kB, 1.166×1.001, 74 mal angesehen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „kafffee“ ()

    kafffee schrieb:

    Okay Dummheit tut weh


    Willkommen in der Welt der Softwareentwicklung ;)
    Solche Hirnfurze haben wir alle mal.

    kafffee schrieb:

    Doch ein Problem muss ich nachschieben

    Dafür sind wir da.

    kafffee schrieb:

    as amerikanische Datumsformat ausgegeben wird... YYYY-MM-DD oder so...


    Das ist das japanische Datums-Format (und mMn sowieso das Format, was alle nutzen sollten).
    Amerikanisch schaut folgendermaßen aus: ​MM-DD-YYYY

    Du könntest das hier probieren:

    C#-Quellcode

    1. if (DateTime.TryParseExact("2015-12-25", "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out var timestamp)) {
    2. // success
    3. } else {
    4. // Fehlermeldung?
    5. }
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    kafffee schrieb:

    Jetzt war ich 25 Jahre der festen Meinung


    Dann hast du noch nie etwas mit DateTimes zu tun gehabt, sowie mit Zeitzonen. Schätz dich glücklich. Es gibt nichts schlimmeres, als Daten und Uhrzeiten...

    kafffee schrieb:

    Versteh ich den Code richtig

    Leider nein :D

    kafffee schrieb:

    der stellt also klassenweit/programmweit/systemweit(??) das benutzte Datumsformat auf AdjustToUniversal?


    Nein, du übergibst der ​TryParseExact-Methode nur das eine Mal diese Parameter mit. Ich weiß ehrlich gesagt gar nicht, ob man das für die gesamte Applikation einstellen kann. Hab ich nie das Bedürfnis gehabt.

    Was der Code macht, ist der versucht mit der Methode das exakte Datum zu parsen, mit einer variablen Culture (also Zeichen, die drin vorkommen) und danach justiert er das zu Universal Time, also UTC+0 (GMT = London Time ohne Sommerzeit).

    Dann gibst noch ​out var timestamp, das ist die Output-Variable.
    Man könnte den Code jetzt noch umschreiben, dass du irgendwo vorher die Variable definierst, aber das macht glaube ich weniger Sinn.

    Im Prinzip musst du dir das ​out var vorstellen, als würdest du per Referenz eine Variable mitgeben. (Naja, so funktioniert es auch im Hintergrund, aber syntactic Sugar und so weiter)
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Gutes Neues! Hoff du bist gut reingeschlittert :)

    siycah schrieb:

    Dann hast du noch nie etwas mit DateTimes zu tun gehabt, sowie mit Zeitzonen.

    In der Tat, zumindest nicht programmatisch :)

    siycah schrieb:

    Leider nein

    Wäre auch zu schön gewesen :)

    Okay ich denke den Code hab ich verstanden. out wäre also das Äquivalent zu ByRef in VB?

    Hab mir meine Datenklassen mal genauer angeschaut. Da gibts nicht mal eine Property As DateTime, nur:

    public DateTimeOffset Date { get; set; }

    Wie würdest du in dem Fall vorgehen?

    Wenn das jetzt eine Property As DateTime gewesen wäre, hätte ich im Getter deinen Code platziert, aber wenn das kein DateTime ist??