Custom JSON-Parser für ein 'not well formed' JSON

  • C#
  • .NET 5–6

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Custom JSON-Parser für ein 'not well formed' JSON

    Hallo Leute

    Ich stehe vor einem kleinen Rätsel welches ich versuche zu Lösen.
    Ich muss eine Custom-API welche über eine Amazon S3 API von Kunden gebaut wurde abfragen.

    Diese API gibt aber leider kein "well-formed" JSON zurück, und der JSON Serializer kann den String nicht parsen.

    Da stellt sich mir die Frage ob man da mit einem "Custom-Parser" weiter kommt oder ob ich da sowieso auf dem Holzweg bin und es da etwas gibt was ich noch nicht kenne.
    Vorweg, die Amazon SDKs brachten mich leider alle nicht weiter, da es ein Kundenspezifischer Endpoint ist (so wie ich das verstanden haben kann man bei Amazon AWS quasi eigene Endpoints bauen und diese um die Amazon API drumrum bauen um gewisse Dinge zu automatisieren.)

    Zur Erklärung. Ich setze einen GET ab (Adresse darf ich leider nicht posten) und bekomme einen Response welche original folgendermaßen aussieht:

    Quellcode

    1. {
    2. "url": "https://xxxxxx-xxxxxx-xxxxx-508184529966-eu-central-1.s3.amazonaws.com/",
    3. "path": 43/5016500/fb385aa6-1dff-488e-b774-13xxxxxxxxcb/,
    4. "fields": {
    5. "acl", private
    6. ,
    7. "key", ${filename
    8. },
    9. "x-amz-algorithm", AWS4-HMAC-SHA256
    10. ,
    11. "x-amz-credential", ASIAXMURXXXXXXXXXXQF/20221008/eu-central-1/s3/aws4_request
    12. ,
    13. "x-amz-date",
    14. 20221008T084350Z
    15. ,
    16. "x-amz-security-token", IQoJb3JpZ2luX2VjEGERyYWwtMSJGMExMezPF0U8R37yrepR25mJNNGE2VxAiBBGgl2KiJcuYuYOUIySzmATbRbuiyA2orbsX+oUgtqaDDUwODE4NDUyOTk2NiIMb3hp/+7gxi5TUQTSUo+59Uf04zeu7AsiNxWATTqy4MO6/naon/bS1Z0WVAesgfMPSErt9/ZrCZ1dSYZzLER/B/QVLsiDODlMbG9Q9KsYHHhSEJbWQKqpLhlc57GFdaYyW3qoH6lQXeqb6yu/DULuPU0KEewP8aKIyWLLvNGgDYPbFnBWeIQpiZYrdxI+7ELRdQNK+EaHTXwXqYKBDpPnVWyTilU22LxvpLH/PCRbbPlmaOJgkVcjJCXvx2rzoNS4mKJqBeu6E/vyHe+68EqJVABgMR594J9VBPZkukixJtUr1KAgmafduOZXWr1I0PsNvvA/+hVBqokYlNa8xU1HnHBpS7sc1slfiJ893kyh5/3ltMSB7KO9kuLk43REtnE0cWWDGRUPYnTfJhGNN1/1VhdIWZG3MMTwhJoGOp8BVcqCGbfvPggmVQ+ADoMDk5b/WQ02SOvZZlPxwIJVHqzfF58pCva/H4rPo0BBVE2SJkp4GYNmejkl8hlaQN3Ddkm9UsOKluvozZcGqTdLSaW/7bE9fR4n6XZZdMyRAW5V17kwMA2BhXOUKnucy7GMTacPVJtxTXh3a/ls9qYH0av9LJTkdiqleRaCbjOCfaCgZATUKVQiW66Y5p18u
    17. ,
    18. "policy", eyJleHBpcmF0aW9uIjogIjIwDk6MDA6MzBaIiwgImNvbmRpdGlvbnMiOiBJpdmF0ZSJ9LCBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAiNDMvNTmYjM4NWFhNi0xZGZmLTQ4OGUtYjc3NC0xMzgyYzdmMjsiY29udGVudC1sZWFuZ2UiLCAwLCA1MjQyODgwXSwgeyJidWN2FyZGVzcy1zY2FubmVyLXN0b3JlLTUwODE4NDUyOTk2Ni1ldS1jSwgWyJzdGFydHMtd2l0aCIsICIka2V5IiwgIiJdLCB7IngtYW16LWFsZ2M0LUhNQUMtU0hBMjU2In0sIHsieC1hbXotY3JlZGVudGlhbCI6IC1VUklSUVhIRExOVVpRRi8yMDIyMTAwOCcmFsLTEvczMvYXdzNF9yZXF1ZXN0In0sIHsieC1hbXotZyMTAwOFQwODQzNTBaIn0sIHsieC1hbXotc2VjdXJpdHktdG9rZW4iOiAiSVFvSmIzSnBaMmx1WDJWakVHRWFER1YxTFdObd0TVNKR01FUUNJRmVmdHhNZXpQRjBVOFIzN3lyZXBSMjVTkpKTk5HRTJWeEFpQkJHZ2wyS2lKY3VZdVlPVUl5U3BMm9yYnNYK29VZ3RxdGlyNUFnZ3FFQUVhRERVd09ERTRORFV5T1RrMkys3Z3hpNVRVUVRSS3RZQzdHZUFpbVpYU1VvKzU5VWYwNHpldTdBc2BOVWRoL1dBVFRxeTRNTzYvZVNZSEJnc0tFSUpFdWQWVzZ2ZNUFNFTHBtRnJ0OS9ackNaMWRTWVp6TEVSL0IvUYldRS3FwTGhsYzU3R0ZkYVl5VzNxb0g2bFFYZXFiNnl1L0RVTHVQVTEZEeDZQOGFLSXlXTEx2TkdnRFlQYkZuQldlSVFwaVpZcmR4SStFYUhUWHdYcVlLQkRwUG5WV3lUaWxTEgvUENSYmJQbG1hT0pna1ZjakpDWHZ4MnJRSKzY4UjF2a0UzKzZLaVVxQUFPWnFKVkFCZ01SNTk0SjlWQlBaa3VraXhKdFVyYQc052dkEvK2hWQnFva1lsTmE4eFUxSG5IQnBTN3NjMXNsZmlKODkza3lS085a3VMazQzUkV0bkUwY1dXREdSVVBZblRaGRJV1pHM01NVHdoSm9HT3AcUNHYmZ2UGdnbVZRK0FEb01EazViL1dRMDJTT3ZaWmxQeHdJSlZIcXpmRjU4cEN2YS9INHJQbzBOOFJCQlZFMlNKa3A0R1lObWVqa2w4aGxhUU4zRGRrbTlVc09LbHV2b3paY0dxVGRMU2FXLlmUjRuNlhaWmRNeVJBVzVWMTdrd01BMkJoWE9VS251Y3k3R01UYWNQVkp0eFRYaDNhL2lMSlRrZGlxbGVSYUNiak9DZmFDZ1pBVFVLVlFpVzY2WTVwMTh1In1dfQ==
    19. ,
    20. "x-amz-signature",
    21. 6dxxxaca24277072xx2a9735a3f01848fb0d8e96ff98cceaxxxxx4f255663967
    22. }
    23. }

    Habe Daten natürlich verändert, Schema wurde aber belassen.

    Dieses JSON kann natürlich nicht geparsed werden, alleine das Strings nicht in '' stehen und das , statt : für die Eigenschaften verwendet werden ist komisch.
    Ich hatte mit solchen Rückgaben noch nie zu tun, aber evtl. hat jemand hier was ähnliches gemacht.

    Witzige Randinfo: Auch diverse Onlinekonverter bringen eine Fehlermeldung, aber Postman erkennt es als JSON und kann es auch "Pretty" anzeigen.

    Hoffe jemand hat eine Idee und bedanke mich schon mal herzlichst fürs durchlesen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    Hallo

    Ich weis jetzt gerade nicht was ich mit dieser Antwort Anfang soll bzw. was du mir damit sagen willst.
    "Error" gefolgt von dem JSON ab dem Punkt an dem es nicht mehr geparsed werden kann soll mir was genau sagen?

    Kannst du bitte etwas Licht ins dunkel bringen? Danke

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    "Error" gefolgt von dem JSON ab dem Punkt an dem es nicht mehr geparsed werden kann soll mir was genau sagen?
    Genau das.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,
    das sieht schon sehr komisch aus. Ist das wirklich das komplette Json, welches zurück kommt? Gibt es evtl. einen Endpunkt mit einer Schemadefinition vom Kunden?
    Das "fields"-Property sieht mir danach aus, als hätten sie einfach HTTP Request/Response Header Werte in das Objekt geschrieben; deshalb die Kommata als Trennzeichen.
    Das einfachste wird wahrscheinlich sein, den Kunden nach einer Schemadefinition zu fragen. Es kann ja nur zwei Möglichkeiten geben: Entweder, das JSON, so wie es da ist, ist einfach nicht valide (z.B. der Wert von "path" steht nicht in ") und der Kunde muss nachbessern, oder es ist einfach ein benutzerdefiniertes Schema. Dann gibt es sicherlich Doku vom Kunden dazu.

    RodFromGermany schrieb:

    Genau das

    Sorry, das weis ich ohne dich auch. Hilft aber niemanden weiter.

    ISliceUrPanties schrieb:

    Ist das wirklich das komplette Json

    Leider ja.

    ISliceUrPanties schrieb:

    Dann gibt es sicherlich Doku vom Kunden dazu

    Habe ich beim Kunden bereits angefragt, geht aber über mehrere Ecken und dauert - falls überhaupt was vernünftiges zurück kommt.

    Aber auch mit dem Schema müsste ich es im Endeffekt dann selbst "manuell" Parsen denke ich.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m Bei mir kommt die Meldung, dass er da ein end-of-array-} erwartet.
    Lade mal die JSON ins Studio, da kommen ggf. noch andere Hinweise.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo nochmals.

    Ich habe nun dank jemand anderem zumindest mal eine etwas unschöne Lösung, aber ich habe eine.
    Im base64 Encodierten string im Knoten "Policy" ist im Grunde das gleiche enthalten (leicht abgewandelt) wie im String den ich zurück bekomme und hier gepostet habe.
    Nur mit dem Unterschied das dieser sich Parsen lässt da er richtig Formatiert ist.

    Ich kann somit das ganze nun Umwandeln.

    Besten Dank für eure Antworten

    PS: Code brauch ich glaube ich hier keinen Posten da es ja nur um die "Idee" ging. Wie man einen Base64 String Decodiert kann man ja Googeln, ist ein einzeiler.


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##