none
JSON auslesen mit VB.-NET RRS feed

  • Frage

  • Hallo,

    ich bekomme von einer WebAPI (Format kann ich nicht beeinflussen) ein JSON geliefert, dass wie folgt aussieht:

    {"movie_results":[
    {
    "genre_ids":[28,12,878],
    "title":"Spider-Man: No Way Home",
    "original_language":"en",
    "original_title":"Spider-Man: No Way Home",
    "poster_path":"/1g0dhYtq4irTY1GPXvft6k4YLjm.jpg",
    "video":false,
    "vote_average":8.2,
    "overview":"texttexttext",
    "release_date":"2021-12-15",
    "vote_count":11355,
    "id":634649,
    "adult":false,
    "backdrop_path":"/iQFcwSGbZXMkeyKrxbPnwnRo5fl.jpg",
    "popularity":6120.418}
    ],
    "person_results":[],
    "tv_results":[],
    "tv_episode_results":[],
    "tv_season_results":[]
    }

    Ich möchte nun den Eintrag "id" auslesen und weiter verarbeiten.

    Leider habe ich nicht den geringsten Schimmer, wie ich das anstellen kann. 

    Wie stelle ich das an?

    Tschau

    Stefan

    Mittwoch, 13. April 2022 17:15

Antworten

  • Hi,

    in der Regel gibt es immer einen Ordner mit dem Namen "bin" in der Website/Webanwendung. Ist nicht zwingend aber ungewöhnlich. Wenn es keinen gibt, erstell in einfach und leg die o.g. DLL dort rein.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 15. April 2022 12:39
    Moderator
  • Hi,

    hier ein kurzes Beispiel, das Du natürlich noch weiter ausbauen solltest. Du erstellst zuerst eine Klasse, die die Daten deiner JSON Rückgabe aufnehmen kann. ApiResult nimmt im Beispiel den gesamten Inhalt, Movie dann jeweils die Daten eines Films. Da movies_result in deinem JSON String ein Array ist, habe ich das dann als List( Of Movie ) untergebracht. (Die restlichen Eigenschaften musst Du dir bei Bedarf noch hinzufügen)

    Imports Newtonsoft.Json
    
    ...
    
    Public Class ApiResult
    
        <JsonProperty( "movie_results" )> _
        Public Property Movies As List( Of Movie )
    
    End Class
    
    Public Class Movie
    
        <JsonProperty( "id" )> _
        Public Property ID                  As Int64
        <JsonProperty( "title" )> _
        Public Property Title               As String
        <JsonProperty( "original_language" )> _
        Public Property OriginalLanguage    As String
        <JsonProperty( "genre_ids" )> _
        Public Property GenreIds            As List( Of Int64 )
    
    End Class

    Im nächsten Schritt holst Du dir das Ergebnis deines WebApi Aufrufs in einen String und lässt den dann über JSON.NET in ein Objekt vom Typ ApiResult deserialisieren.

    Dim JsonString As String
    Dim ApiResult  As ApiResult
    
        JsonString = ...
        ApiResult  = JsonConvert.DeserializeObject( Of ApiResult )( JsonString )

    In ApiResult.Movies stehen dann jetzt die Filmdaten. Da es wie bereits gesagt, mehrere Elemente geben könnte, musst Du die entweder mit einer Schleife durchlaufen oder ganz gezielt bspw. über:

    ApiResult.Movies( 0 ).ID

    auf das erste Element zugreifen. Eine Prüfung, ob es überhaupt ein Element gibt, sollte natürlich mit eingebaut werden.

    Das Beispiel nutzt JSON.NET, da wirst Du bei .NET Classic auch nicht wirklich drumrum kommen. D.h. füg in dein Projekt einen Verweis auf Newtonsoft.Json ein, entweder per Nuget oder als Assemblyverweis (in dem Fall leg die passende Newtonsoft.Json.dll im BIN Ordner deiner Anwendung ab)

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport



    Donnerstag, 14. April 2022 11:27
    Moderator
  • Donnerstag, 14. April 2022 13:04
  • Hallo zusammen,

    Danke, aber gibt es evtl. auch einen Weg das ohne third-party Module zu machen? (Würde ich bevorzugen)

    @Birdie.Birdies: Zusätzlich zu den von Olaf angesprochenen Klassen kannst Du in .NET die Klassen in den Namespaces System.Text.Json und System.Text.Json.Serialization bemühen. Eine Übersicht findest Du in diesem Artikel:
    How to serialize and deserialize (marshal and unmarshal) JSON in .NET

    Für das Lesen einer vorhandenen JSON-Datei mithilfe der JsonSerializer-Klasse verweise ich Dich auf die Codebeispiele im Abschnitt How to read JSON as .NET objects (deserialize) und hoffe, dass Du dadurch weiterkommen wirst.

    Beachte die Anmerkung über die Visual Basic-Unterstützung, die von der Utf8JsonReader-Klasse abrät, über die Webstandardwerte in ASP.NET Core-Projekten (Quelle), sowie den Hinweis auf die unterstützten Mindestversionen von .NET Core und .NET Framework, wenn das für Deine Projektart von Bedeutung ist (d. h. wenn Dein Projekt nicht auf .NET 5 eingestellt wurde):
    Try the new System.Text.Json APIs

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 14. April 2022 14:34
    Moderator
  • Hi,

    Ich habe auf dem IIS jetzt .Net5 installiert, bin mir aber nicht sicher, ob der das auch "verwendet".

    nö. Da dein Projekt bzw. deine Website eine .NET Framework 4.8 Anwendung ist. .NET 5 ist leider eine ganz andere Technologie und hat mit dem alten .NET Framework nichts mehr zu tun. Die Umbenennungswut seitens Microsoft hat die Verwirrungen leider immer nur verschlimmert.

    Die Fehlermeldungen zeigen jedenfalls unten drunter immer noch
    Versionsinformationen: Microsoft .NET Framework-Version:4.0.30319; ASP.NET-Version:4.8.4494.0

    Also .NET Framework/Classic.

    JsonSerializer.Deserialize
    aufrufe bekomme ich auf der Website jedenfalls den Fehler BC30451: "JsonSerializer" ist nicht deklariert.

    Das liegt dann wohl daran, dass die Newtonsoft.Json.dll nicht im BIN Order der Website liegt und/oder kein Verweis auf diese Assembly in deinem Projekt hinterlegt ist.

    Das mit dem JSON.NET probiere ich gerne aus, nur wie sage ich dem IIS, dass er das benutzen soll. (externe Module mag ich nur nicht so... siehe zB Log4J ;) aber einen Versuch ist es wert, wenn es keinen anderen Weg gibt.)

    Es gäbe andere Wege. Die sind aber weder einfacher noch sicherer.

    der VB Code von Dir ist mir soweit klar, nur eben nicht wie ich das JSON.NET aus dem Webserver aktiviert bekomme.

    Du hast doch ein lokales Projekt/eine Website, das/die Du mit einer Entwicklungsumgebung bearbeitest, oder? Welche IDE verwendest Du? Visual Studio?

    Je nachdem, ob Du eine Website oder ein Webanwendungsprojekt hast, unterscheidet sich die Vorgehensweise ein wenig. Aber ganz generell geht man über Projekt -> ggfs. Eigenschaften -> Verweise -> Verweis hinzufügen -> Newtonsoft.Json.dll auswählen.

    Du wirst ja nicht direkt auf dem Server mit Notepad in den Dateien arbeiten :) Falls doch, änder das mal und installier dir lokal den IIS (ist seit Windows XP bei jedem Windows Client OS möglich, seit Vista ist der IIS auch so gut wie identisch mit dem der Server Versionen)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 15. April 2022 11:04
    Moderator

Alle Antworten

  • Hallo Stefan,

    schau dir mal JSON.NET an. Damit geht das recht einfach.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 13. April 2022 17:44
    Moderator
  • Danke, aber gibt es evtl. auch einen Weg das ohne third-party Module zu machen? (Würde ich bevorzugen)
    Mittwoch, 13. April 2022 17:50
  • Hi,

    welches Framework (.NET Classic, .NET Core, ...) setzt Du denn ein?

    Ich nehme ja nicht an, dass Du das alles (parsen von JSON Strings, ...) komplett selbst schreiben willst, oder?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 13. April 2022 18:33
    Moderator
  • Jetzt muss ich mich wohl als Noob outen :-/

    Läuft auf einem Server 2019 mit .Net 4.8 installiert.

    Der laufende IIS zeigt als Anwendungspools

    .NET v4.5

    .NET v4.5 Classic

    ich tippe also mal auf .Net Classic?

    Ich würde notfalls nat. auch dieses JSON.NET nutzen. Die Schreiben dort unter deren Vorteilen, dass sie schneller als die Build-In Lösung wären. da ich hier nichts mit 1000den Abfragen mache, dachte ich, dass das Build-

    Wie bekomme ich das integriert, dass mir die Kommandos zur Verfügung stehen? Auf der Homepage dort, habe ich nichts zu Installation gefunden. (oder ich bin zu blöd das zu finden)

    Mittwoch, 13. April 2022 19:25
  • Hi,

    ohne das böse zu meinen: Dein Wissensstand rund um Programmierung ist wie? Aufgrund der Angaben nehme ich an, eher nur sehr rudimentär?

    Das ist für mich nur deswegen wichtig, damit ich zielgerichteter antworten kann. Die Grundlagen der Programmierung an sich, auch die Basics von VB.NET und/oder [ASP].NET Entwicklung können (und wollen) wir dir hier im Forum nicht beibringen, das musst Du dann schon selbst machen. Aber bei jemanden, der erst anfängt, muss man ggfs. für bestimmte Beispiele weiter ausholen also bei einem erfahrenen Entwickler, der nur ein spezifisches Problem lösen muss.

    Daher die Frage.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 14. April 2022 07:30
    Moderator
  • Hi,

    hier ein kurzes Beispiel, das Du natürlich noch weiter ausbauen solltest. Du erstellst zuerst eine Klasse, die die Daten deiner JSON Rückgabe aufnehmen kann. ApiResult nimmt im Beispiel den gesamten Inhalt, Movie dann jeweils die Daten eines Films. Da movies_result in deinem JSON String ein Array ist, habe ich das dann als List( Of Movie ) untergebracht. (Die restlichen Eigenschaften musst Du dir bei Bedarf noch hinzufügen)

    Imports Newtonsoft.Json
    
    ...
    
    Public Class ApiResult
    
        <JsonProperty( "movie_results" )> _
        Public Property Movies As List( Of Movie )
    
    End Class
    
    Public Class Movie
    
        <JsonProperty( "id" )> _
        Public Property ID                  As Int64
        <JsonProperty( "title" )> _
        Public Property Title               As String
        <JsonProperty( "original_language" )> _
        Public Property OriginalLanguage    As String
        <JsonProperty( "genre_ids" )> _
        Public Property GenreIds            As List( Of Int64 )
    
    End Class

    Im nächsten Schritt holst Du dir das Ergebnis deines WebApi Aufrufs in einen String und lässt den dann über JSON.NET in ein Objekt vom Typ ApiResult deserialisieren.

    Dim JsonString As String
    Dim ApiResult  As ApiResult
    
        JsonString = ...
        ApiResult  = JsonConvert.DeserializeObject( Of ApiResult )( JsonString )

    In ApiResult.Movies stehen dann jetzt die Filmdaten. Da es wie bereits gesagt, mehrere Elemente geben könnte, musst Du die entweder mit einer Schleife durchlaufen oder ganz gezielt bspw. über:

    ApiResult.Movies( 0 ).ID

    auf das erste Element zugreifen. Eine Prüfung, ob es überhaupt ein Element gibt, sollte natürlich mit eingebaut werden.

    Das Beispiel nutzt JSON.NET, da wirst Du bei .NET Classic auch nicht wirklich drumrum kommen. D.h. füg in dein Projekt einen Verweis auf Newtonsoft.Json ein, entweder per Nuget oder als Assemblyverweis (in dem Fall leg die passende Newtonsoft.Json.dll im BIN Ordner deiner Anwendung ab)

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport



    Donnerstag, 14. April 2022 11:27
    Moderator
  • Donnerstag, 14. April 2022 13:04
  • Hallo zusammen,

    Danke, aber gibt es evtl. auch einen Weg das ohne third-party Module zu machen? (Würde ich bevorzugen)

    @Birdie.Birdies: Zusätzlich zu den von Olaf angesprochenen Klassen kannst Du in .NET die Klassen in den Namespaces System.Text.Json und System.Text.Json.Serialization bemühen. Eine Übersicht findest Du in diesem Artikel:
    How to serialize and deserialize (marshal and unmarshal) JSON in .NET

    Für das Lesen einer vorhandenen JSON-Datei mithilfe der JsonSerializer-Klasse verweise ich Dich auf die Codebeispiele im Abschnitt How to read JSON as .NET objects (deserialize) und hoffe, dass Du dadurch weiterkommen wirst.

    Beachte die Anmerkung über die Visual Basic-Unterstützung, die von der Utf8JsonReader-Klasse abrät, über die Webstandardwerte in ASP.NET Core-Projekten (Quelle), sowie den Hinweis auf die unterstützten Mindestversionen von .NET Core und .NET Framework, wenn das für Deine Projektart von Bedeutung ist (d. h. wenn Dein Projekt nicht auf .NET 5 eingestellt wurde):
    Try the new System.Text.Json APIs

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 14. April 2022 14:34
    Moderator
  • ich verdiene nicht mein Geld mit Programmieren, wenn Du das meinen solltest... sonst würde ich wohl auch kaum in einem Forum Fragen stellen.... aber ich komme sonst seit vielen Jahren ganz gut recht ;-)

    Ich habe bisher schlicht noch nie 3rd Party Module benötigt, was meiner Meinung nach auch nach Möglichkeit zu vermeiden ist, da man sich sonst nur um weitere Ecken bzgl. Sicherheitsproblemen/Updates kümmern muss.

    Daher meine primäre Suche nach Build-In Funktionen.

    Auch mit JSON hatte ich bisher halt noch nichts zu tun, eher mit XML oder SQL Anbindungen.

    Vermutlich wusstest Du schon bevor Du sowas zum ersten Mal gemacht hast, wie das geht, ohne jemanden zu fragen... SO gut bin ich leider nicht. ;)



    Freitag, 15. April 2022 07:41
  • Vermutlich wusstest Du schon bevor Du sowas zum ersten Mal gemacht hast, wie das geht, ohne jemanden zu fragen... SO gut bin ich leider nicht.

    So wirklich verstehe ich nicht, warum Du jetzt eingeschnappt bist. Zum einen hab ich dir erklärt, warum ich frage und zum anderen hast Du oben ein lauffähiges Beispiel.

    Zu deiner Annahme, dass nur Hobbyentwickler Fragen stellen: Nö. Auch solche mit jahr(zehnt)elanger Erfahrung können und sollen Fragen stellen. Denn irgendwann stößt man immer mal auf etwas, was man selbst nicht oder nur mit hohem Aufwand lösen könnte. Da ist es völlig legitim, wenn man sich in den Communities umhört. Das mache ich genauso wie alle anderen auch.

    Meine Annahme, dass Du keine Erfahrung hast, kam einfach hierdurch:

    Läuft auf einem Server 2019 mit .Net 4.8 installiert.

    Der laufende IIS zeigt als Anwendungspools

    .NET v4.5
    .NET v4.5 Classic

    ich tippe also mal auf .Net Classic?

    Du müsstest schon wissen, mit welcher Technologie, welchem Framework, ... Du arbeitest. Aber wie bereits geschrieben, war das nur als Frage gedacht, damit man zielgerichteter (ggfs. ausführlicher, besser beschrieben, ...) antworten kann, nicht, um dich anzugreifen. Wenn Du das so empfunden hast, tut es mir leid, das war nicht meine Absicht.

    Noch zu JSON.NET: Das ist eine quasi Standardlibrary, die millionenfach eingesetzt wird, im Quellcode einsehbar ist und früher, als es noch nichts ordentliches im Framework selbst gab, auch von MS empfohlen wurde. Das sagt zwar nicht, dass es keine Bugs gibt und dass JSON.NET nicht das nächste log4j wird, aber die Wahrscheinlichkeit, auf was richtig fieses zu stoßen dürfte ungefähr so groß sein wie bei den im Framework direkt verfügbaren Json Möglichkeiten, also eher gering.

    Seit .NET (Core, nicht Classic/Framework) 3.1 gibt es, wie von Dimitar bereits geschrieben, im System.Text.Json Namespace auch direkt integrierte Klassen, die einen ähnlichen Ansatz wie JSON.NET ermöglichen. Aber dafür müsstest Du eben .NET Core und nicht .NET Classic/Framework verwenden.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 15. April 2022 10:04
    Moderator
  • vielleicht habe ich Dich da falsch verstanden... großes sorry dafür...

    Ich habe auf dem IIS jetzt .Net5 installiert, bin mir aber nicht sicher, ob der das auch "verwendet". 

    Die Fehlermeldungen zeigen jedenfalls unten drunter immer noch

    Versionsinformationen: Microsoft .NET Framework-Version:4.0.30319; ASP.NET-Version:4.8.4494.0

    an.

    wenn ich das 

    JsonSerializer.Deserialize

    aufrufe bekomme ich auf der Website jedenfalls den Fehler BC30451: "JsonSerializer" ist nicht deklariert.

    Daher nehme ich an, dass irgendwas fehlt/falsch eingestellt ist.

    Das mit dem JSON.NET probiere ich gerne aus, nur wie sage ich dem IIS, dass er das benutzen soll. (externe Module mag ich nur nicht so... siehe zB Log4J ;) aber einen Versuch ist es wert, wenn es keinen anderen Weg gibt.)

    Ich kann zwar den Import im Code machen, aber davon weiß ja später der IIS noch nicht, was er damit tun muss.

    Leider finde ich dazu nichts.

    Also was muss wo hin kopiert werden/registriert werden und vor allem wie.

    der VB Code von Dir ist mir soweit klar, nur eben nicht wie ich das JSON.NET aus dem Webserver aktiviert bekomme.

    Freitag, 15. April 2022 10:51
  • Hi,

    Ich habe auf dem IIS jetzt .Net5 installiert, bin mir aber nicht sicher, ob der das auch "verwendet".

    nö. Da dein Projekt bzw. deine Website eine .NET Framework 4.8 Anwendung ist. .NET 5 ist leider eine ganz andere Technologie und hat mit dem alten .NET Framework nichts mehr zu tun. Die Umbenennungswut seitens Microsoft hat die Verwirrungen leider immer nur verschlimmert.

    Die Fehlermeldungen zeigen jedenfalls unten drunter immer noch
    Versionsinformationen: Microsoft .NET Framework-Version:4.0.30319; ASP.NET-Version:4.8.4494.0

    Also .NET Framework/Classic.

    JsonSerializer.Deserialize
    aufrufe bekomme ich auf der Website jedenfalls den Fehler BC30451: "JsonSerializer" ist nicht deklariert.

    Das liegt dann wohl daran, dass die Newtonsoft.Json.dll nicht im BIN Order der Website liegt und/oder kein Verweis auf diese Assembly in deinem Projekt hinterlegt ist.

    Das mit dem JSON.NET probiere ich gerne aus, nur wie sage ich dem IIS, dass er das benutzen soll. (externe Module mag ich nur nicht so... siehe zB Log4J ;) aber einen Versuch ist es wert, wenn es keinen anderen Weg gibt.)

    Es gäbe andere Wege. Die sind aber weder einfacher noch sicherer.

    der VB Code von Dir ist mir soweit klar, nur eben nicht wie ich das JSON.NET aus dem Webserver aktiviert bekomme.

    Du hast doch ein lokales Projekt/eine Website, das/die Du mit einer Entwicklungsumgebung bearbeitest, oder? Welche IDE verwendest Du? Visual Studio?

    Je nachdem, ob Du eine Website oder ein Webanwendungsprojekt hast, unterscheidet sich die Vorgehensweise ein wenig. Aber ganz generell geht man über Projekt -> ggfs. Eigenschaften -> Verweise -> Verweis hinzufügen -> Newtonsoft.Json.dll auswählen.

    Du wirst ja nicht direkt auf dem Server mit Notepad in den Dateien arbeiten :) Falls doch, änder das mal und installier dir lokal den IIS (ist seit Windows XP bei jedem Windows Client OS möglich, seit Vista ist der IIS auch so gut wie identisch mit dem der Server Versionen)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 15. April 2022 11:04
    Moderator
  • Also für die Bearbeitung des Codes nutze ich Visual Studio 2022. (Auf einem Client natürlich)

    Aber JA ich arbeite direkt via FileShare mit den Files vom Webserver. (das ist nur von mir und der Familie benutzt, und nicht vom Internet aus erreichbar)

    Einen BIN Ordner hat die Website nicht, oder ich weiß nicht, was Du damit meinst.


    Freitag, 15. April 2022 11:48
  • Hi,

    in der Regel gibt es immer einen Ordner mit dem Namen "bin" in der Website/Webanwendung. Ist nicht zwingend aber ungewöhnlich. Wenn es keinen gibt, erstell in einfach und leg die o.g. DLL dort rein.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 15. April 2022 12:39
    Moderator