Daten aus Json-String auslesen

  • VB.NET
  • .NET 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Linkai.

    Daten aus Json-String auslesen

    In diesem Thread ging es um folgendes Porblem:
    Spoiler anzeigen


    Hallo liebe Community,

    ich sitz mal wieder aufm Schlauch mit wahrscheinlich 5 Knoten drinne...

    Ich spiel grad ein wenig mit der API von Twitch rum.
    Ich hab mir nen Status gebastelt ob ein Stream läuft oder nicht. Funktioniert auch alles wunderbar.
    Nun möchte ich aber, falls der Stream läuft die Daten des Streams auslesen. Dabei wird folgender String zurück gebracht:

    Spoiler anzeigen
    {"_links":{"self":"https://api.twitch.tv/kraken/streams/test","channel":"https://api.twitch.tv/kraken/channels/test"},"stream":{"_id":13092721904,"game":"League of Legends","viewers":34,"created_at":"2015-02-11T09:37:07Z","_links":{"self":"https://api.twitch.tv/kraken/streams/test"},"preview":{"small":"http://static-cdn.jtvnw.net/previews-ttv/live_user_test-80x45.jpg","medium":"http://static-cdn.jtvnw.net/previews-ttv/live_user_ltest-320x180.jpg","large":"http://static-cdn.jtvnw.net/previews-ttv/live_user_lol_mexico-640x360.jpg","template":"http://static-cdn.jtvnw.net/previews-ttv/live_user_lol_mexico-{width}x{height}.jpg"},"channel":{"_links":{"self":"https://api.twitch.tv/kraken/channels/test","follows":"https://api.twitch.tv/kraken/channels/lol_mexico/follows","commercial":"https://api.twitch.tv/kraken/channels/lol_mexico/commercial","stream_key":"https://api.twitch.tv/kraken/channels/lol_mexico/stream_key","chat":"https://api.twitch.tv/kraken/chat/lol_mexico","features":"https://api.twitch.tv/kraken/channels/lol_mexico/features","subscriptions":"https://api.twitch.tv/kraken/channels/lol_mexico/subscriptions","editors":"https://api.twitch.tv/kraken/channels/lol_mexico/editors","videos":"https://api.twitch.tv/kraken/channels/lol_mexico/videos","teams":"https://api.twitch.tv/kraken/channels/lol_mexico/teams"},"background":null,"banner":"http://static-cdn.jtvnw.net/jtv_user_pictures/lol_mexico-channel_header_image-ac75b4633812e211-640x125.png","broadcaster_language":"es","display_name":"LoL_Mexico","game":"League of Legends","logo":"http://static-cdn.jtvnw.net/jtv_user_pictures/lol_mexico-profile_image-75717d131dd6aec0-300x300.png","mature":false,"status":"Weboz con Tortilla: Duo uPss & Doble R Carranco Mankeando ","partner":true,"url":"http://www.twitch.tv/lol_mexico","video_banner":"http://static-cdn.jtvnw.net/jtv_user_pictures/lol_mexico-channel_offline_image-5efb6ae58d38cf2f-640x360.png","_id":40254000,"name":"lol_mexico","created_at":"2013-02-12T06:18:10Z","updated_at":"2015-02-11T10:16:45Z","delay":0,"followers":8861,"profile_banner":"http://static-cdn.jtvnw.net/jtv_user_pictures/lol_mexico-profile_banner-5e65f117784b73b7-480.png","profile_banner_background_color":null,"views":559397,"language":"en"}}}



    Jetzt versuche ich die ganze zeit bei diesem String in der ersten zeile nach "game": das Spiel auszulesen.
    habs grad mit trim versucht aber iwie sitz ich da aufm Schlauch...

    VB.NET-Quellcode

    1. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    2. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    3. Try
    4. Dim description As String = resultstring
    5. Dim fie As Integer = description.IndexOf("""game"":""") 'das erste = im string
    6. Dim lia As Integer = description.IndexOf("""") 'das letzte & im string
    7. fie += 1 'Weil index bei 0 anfängt, muss hier die indexposition um 1 erhöht werden.
    8. Dim rslt As String = description.Substring(fie, lia - fie)
    9. MessageBox.Show(fie & " " & lia & " " & rslt)
    10. Catch ex As Exception
    11. MessageBox.Show(ex.Message)
    12. End Try



    Dazu haben wir, gemeinsam als Community eine Lösung ermittelt.
    Ich möchte für die Tipps folgenden Usern Danken, die mir nicht zum ersten Mal geholfen haben :):
    @RodFromGermany
    @ErfinderDesRades
    @Rootbob91
    @slice
    @KaskadekingDE

    So die Lösung:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Function get_infos(ByVal aktive_channel As Integer) As Boolean
    2. 'Hier wird der aktuell makierte Kanal ermittelt
    3. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    4. 'als nächtes wird der String in resultstring gespeichert
    5. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    6. 'hier wird dann der Resultstring Deserialisiert und "channel" in der veralteten Msgbox ausgegeben.
    7. Dim jread As RootObject = Json.JsonConvert.DeserializeObject(Of RootObject)(resultstring)
    8. MsgBox(jread.stream.game)
    9. Return True
    10. End Function


    und die Klassen für meine Json

    VB.NET-Quellcode

    1. Public Class Links
    2. Public Property self As String
    3. Public Property channel As String
    4. End Class
    5. Public Class Links2
    6. Public Property self As String
    7. End Class
    8. Public Class Preview
    9. Public Property small As String
    10. Public Property medium As String
    11. Public Property large As String
    12. Public Property template As String
    13. End Class
    14. Public Class Links3
    15. Public Property self As String
    16. Public Property follows As String
    17. Public Property commercial As String
    18. Public Property stream_key As String
    19. Public Property chat As String
    20. Public Property features As String
    21. Public Property subscriptions As String
    22. Public Property editors As String
    23. Public Property videos As String
    24. Public Property teams As String
    25. End Class
    26. Public Class Channel
    27. Public Property _links As Links3
    28. Public Property background As Object
    29. Public Property banner As String
    30. Public Property broadcaster_language As String
    31. Public Property display_name As String
    32. Public Property game As String
    33. Public Property logo As String
    34. Public Property mature As Boolean
    35. Public Property status As String
    36. Public Property partner As Boolean
    37. Public Property url As String
    38. Public Property video_banner As String
    39. Public Property _id As Integer
    40. Public Property name As String
    41. Public Property created_at As String
    42. Public Property updated_at As String
    43. Public Property delay As Integer
    44. Public Property followers As Integer
    45. Public Property profile_banner As String
    46. Public Property profile_banner_background_color As String
    47. Public Property views As Integer
    48. Public Property language As String
    49. End Class
    50. Public Class Stream
    51. Public Property _id As Long
    52. Public Property game As String
    53. Public Property viewers As Integer
    54. Public Property created_at As String
    55. Public Property _links As Links2
    56. Public Property preview As Preview
    57. Public Property channel As Channel
    58. End Class
    59. Public Class RootObject
    60. Public Property _links As Links
    61. Public Property stream As Stream
    62. End Class





    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

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

    danke für den Tipp nur hab ich bis heute noch nicht damit gearbeitet
    (Hab auch grad erstmal die Grundlagen von Java in der Berufsschule angefangen.)

    könntest du mir das kurz näher erklären?
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Du bildest die Datenstruktur des JSON als Klassen ab, dann kannst du mit der JavaScriptSerializer- oder DataContractJsonSerializer-Klasse den String deserialisieren und relativ einfach auf die Werte zugreifen.
    Ein JSON-String ist soweit nichts anderes als ein normaler String, "er" unterliegt nur letztendlich einer bestimmten Formatierung.
    JSON steht für JavaScript Object Notation und bietet die Möglichkeit Objekte zu de-/serialisieren (sprich diese vom fertigen .NET Objekt zu einem String zu verwandeln und zurück).

    Um diese Strings zu verarbeiten, kannst du die JavaScriptSerializer-Klasse aus dem System.Web.Script.Serialization-Namespace nutzen.
    Diese musst du wie jede andere Klasse instanzieren:

    VB.NET-Quellcode

    1. Dim jsonSerializer As New System.Web.Script.Serialization.JavaScriptSerializer


    Und anschließend normal mit deren Methoden arbeiten:

    VB.NET-Quellcode

    1. Dim tmpInfo As DeineInformationsKlasse
    2. tmpInfo = jsonSerializer.Deserialize(Of DeineInformationsKlasse)(DeinJSONString)


    Hier musst du beachten, dass DeineInformationsKlasse alle Eigenschaften bereitstellt, die letztendlich übernommen werden sollen.
    (Sprich die aus dem JSON-String übernommen werden sollen).
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Linkai schrieb:

    folgender String
    sieht als JSon so aus:
    Bilder
    • JSon.jpg

      101,06 kB, 831×737, 254 mal angesehen
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich sitze momentan wohl total aufm Schlauch haha :D,

    ich habe mir jetzt die Json.NET lib von : newtonsoft.com/json <-- geladen.
    Diese eingebunden aber irgendwie steige ich da nicht durch. Ich hab noch nie mit C# gearbeitet und habe daher nen C#->.Net converter verwendet und habe nun das hier zusammen nur komme ich ab hier nicht mehr weiter T_T..

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Threading
    3. Imports Newtonsoft
    4. Public Class Form1
    5. Dim wc As New WebClient
    6. Dim server As String = "https://api.twitch.tv/kraken"
    7. Dim initthread As New Thread(AddressOf init)
    8. Dim json1 As New Newtonsoft.Json.Converters.BinaryConverter
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. wc.Proxy = Nothing
    11. End Sub
    12. Sub init()
    13. Me.Invoke(Sub() ListView1.Items.Clear())
    14. For Each channel In IO.File.ReadAllLines("channels.lat")
    15. Dim resultstring As String = wc.DownloadString(server & "/streams/" & channel)
    16. ' Label1.Text = "{" & """_links""" & ":{" & """self""" & ":""https://api.twitch.tv/kraken/streams/" & channel & """, ""channel"":""https://api.twitch.tv/kraken/channels/" & channel & """}," & """stream""" & ":null}"
    17. ' Label2.Text = resultstring
    18. If resultstring.Contains("""stream"":null") Then
    19. Dim entry As New ListViewItem
    20. entry.Text = channel
    21. entry.BackColor = Color.DarkRed
    22. entry.ForeColor = Color.White
    23. Me.Invoke(Sub() ListView1.Items.Add(entry))
    24. Else
    25. Dim entry As New ListViewItem
    26. entry.Text = channel
    27. entry.BackColor = Color.LightGreen
    28. Me.Invoke(Sub() ListView1.Items.Add(entry))
    29. End If
    30. Next
    31. get_infos(0)
    32. End Sub
    33. Function get_infos(ByVal aktive_channel As Integer) As Boolean
    34. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    35. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    36. Dim test As New Account
    37. test =
    38. Return True
    39. End Function
    40. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    41. initthread.Start()
    42. End Sub
    43. End Class
    44. Public Class Account
    45. Public Property Email() As String
    46. Get
    47. End Get
    48. Set(ByVal value As String)
    49. End Set
    50. End Property
    51. Public Property Active() As Boolean
    52. Get
    53. End Get
    54. Set(ByVal value As Boolean)
    55. End Set
    56. End Property
    57. Public Property CreatedDate() As DateTime
    58. Get
    59. End Get
    60. Set(ByVal value As DateTime)
    61. End Set
    62. End Property
    63. Public Property Roles() As IList
    64. Get
    65. End Get
    66. Set(ByVal value As IList)
    67. End Set
    68. End Property
    69. End Class

    Die Public Class account war erstmal aus dem Beispiel übernommen.
    Das ganze soll in die Function get_infos rein :O
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

    Linkai schrieb:

    VB.NET-Quellcode

    1. Public Class Account
    machst Du einfach:

    VB.NET-Quellcode

    1. Public Class Account
    2. Public Property Email() As String
    3. Public Property Active() As Boolean
    4. Public Property CreatedDate() As DateTime
    5. Public Property Roles() As IList
    6. End Class
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    so, dank @KaskadekingDE habe ich es nun geschafft... so einiger maßen :D Als Test wollte ich nun den Offlinestring von meinem Twitchaccount verwenden. Der sieht wie folgt aus:

    Spoiler anzeigen
    {"_links":{"self":"https://api.twitch.tv/kraken/streams/kimaru94","channel":"https://api.twitch.tv/kraken/channels/kimaru94"},"stream":null}


    VB.NET-Quellcode

    1. Function get_infos(ByVal aktive_channel As Integer) As Boolean
    2. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    3. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    4. Dim test As _links = Json.JsonConvert.DeserializeObject(Of _links)(resultstring)
    5. MsgBox(test.Channel)
    6. Return True
    7. End Function


    und die Classe:

    VB.NET-Quellcode

    1. Public Class _links
    2. Public Property channel() As String
    3. Public Property self() As String
    4. end class


    Soweit so gut aber die Msgbox bleibt leer...?




    EDIT:

    Ich habe jetzt nochmal rumgespielt: wenn ich die Funktion nun aufrufe, wird auch ausgelesen

    VB.NET-Quellcode

    1. Function get_infos(ByVal aktive_channel As Integer) As Boolean
    2. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    3. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    4. Dim test As _links = Json.JsonConvert.DeserializeObject(Of _links)(resultstring)
    5. MsgBox(test.Channel)
    6. Dim reader As Json.JsonTextReader = New Json.JsonTextReader(New IO.StringReader(resultstring))
    7. While (reader.Read)
    8. If Not reader.Value = Nothing Then
    9. MetroPanelCategory1.TextSubline = MetroPanelCategory1.TextSubline & reader.Value & vbNewLine
    10. End If
    11. End While
    12. Return True
    13. End Function


    Allerdings komme ich damit immernoch nicht so an mein ziel wie ich es will .. die methode mit Json.JsonConvert.DeserializeObject(Of _links)(resultstring) gefällt mir an sich ganz gut,
    da das Abfragen der einzelnen Infos so einfacher ist. Nur bekommt ich das nicht damit hin >-<..

    Edit2:
    Okay ich habe herausgefunden warum das nicht geht.
    Mit der Aktuellen Abfrage will ich aus dem Standardbereich etwas abfragen der selber keine member hat. Ich müsste dazu also in die ebene _links oder Stream eintauchen doch jetzt hänge ich da wieder rum -.-" mit mir ist heute echt nichts anzufangen :D
    Bilder
    • lat2.PNG

      4,67 kB, 553×232, 164 mal angesehen
    • lat1.PNG

      362,3 kB, 781×533, 191 mal angesehen
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

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

    Echt? Wusste ich ned #ironie off,
    ich dachte json files sind parts von java (sind ja auch bei mc vorhanden)

    dein beitrag half mir aber auch nicht bei meinem problem dass ich nicht die einträge der obersten ebene abfragen will(was ich mittlerweile geschafft habe), sondern dass ich die einträge aus _links und stream abfragen will... Nur habe ich keine Ahnung wie(schreibe auch gerade mitm handy.. Poste morgen den code den ich bis jetzt habe.)
    wenn einer noch ne idee hat .. :)

    danke euch allen bis hierhin aber schonmal :)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

    Linkai schrieb:

    wenn einer noch ne idee hat
    Es gibt folgende Möglichkeiten:
    1. Holzhammer: Du klopfst die Info aus dem string heraus, indem Du an ";" splittest und den richtigen Eintrag findest.
    2. JSon-Interpreter: Du liest die JSon-Datei als solche in eine entsprechende Klasse (Instanz) ein und liest den richtigen Eintrag aus.
    3. C#: Wenn die Struktur dieser JSon-Datei fix ist, lässt Du Dir eine C#-Klasse draus generieren und rufst einfach die entsprechende Property ab. Gugst Du hier.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke an @RodFromGermany für den Tipp :)

    Allerdings arbeite ich nicht mit C#, sondern mit .Net
    2. Habe ich ja bereits eine Klasse erstellt und rufe bereits eine Property ab, bekomme dies allerdings nur mit der ersten Ebene hin.
    Momentan bin ich zu dumm um eine Klasse in einer Klasse zu erstellen um dort den die Properties lesen -.-"

    Wenn ich mir also den Json String anschaue:
    Hauptklasse: { }
    und da drin sind 2 weitere Klassen : { links:{} , stream:{} }

    Ich habe zum blegen meiner oben genannten Vermutung nun einfach einen eintrag in der Hauptklasse gemacht also

    {
    "test":"inhalt"
    "links":{}
    "stream":{}
    }

    test kann ich auslesen aber ich bin zu dumm um die inhalte aus links oder Stream richtig aus zu lesen.
    Das ist mein letztes, eigentliches Problem :P
    (Die Holzhammermethode wäre sicherlich die einfachere Methode für mich aber 1. Lerne ich dabei nichts neues, was ich ja mit diesem Projekt bezwecken möchte und 2. ist das sehr unsauber).

    Aktueller code:

    VB.NET-Quellcode

    1. Function get_infos(ByVal aktive_channel As Integer) As Boolean
    2. 'Hier wird der aktuell makierte Kanal ermittelt
    3. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    4. 'als nächtes wird der String in resultstring gespeichert
    5. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    6. 'und hier gegen meinen Teststring ausgetauscht
    7. resultstring = "{ ""channel"": ""https://api.twitch.tv/kraken/channels/gurke4life"",""_links"":{""self"":""https://api.twitch.tv/kraken/streams/gurke4life"",""channel"":""https://api.twitch.tv/kraken/channels/gurke4life""},""stream"":{""_id"":13094757504,""game"":""League of Legends"",""viewers"":1536,""created_at"":""2015-02-11T14:33:40Z"",""_links"":{""self"":""https://api.twitch.tv/kraken/streams/gurke4life""},""preview"":{""small"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-80x45.jpg"",""medium"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-320x180.jpg"",""large"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-640x360.jpg"",""template"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-{width}x{height}.jpg""},""channel"":{""_links"":{""self"":""https://api.twitch.tv/kraken/channels/gurke4life"",""follows"":""https://api.twitch.tv/kraken/channels/gurke4life/follows"",""commercial"":""https://api.twitch.tv/kraken/channels/gurke4life/commercial"",""stream_key"":""https://api.twitch.tv/kraken/channels/gurke4life/stream_key"",""chat"":""https://api.twitch.tv/kraken/chat/gurke4life"",""features"":""https://api.twitch.tv/kraken/channels/gurke4life/features"",""subscriptions"":""https://api.twitch.tv/kraken/channels/gurke4life/subscriptions"",""editors"":""https://api.twitch.tv/kraken/channels/gurke4life/editors"",""videos"":""https://api.twitch.tv/kraken/channels/gurke4life/videos"",""teams"":""https://api.twitch.tv/kraken/channels/gurke4life/teams""},""background"":null,""banner"":null,""broadcaster_language"":""de"",""display_name"":""Gurke4life"",""game"":""League of Legends"",""logo"":""http://static-cdn.jtvnw.net/jtv_user_pictures/gurke4life-profile_image-da5c91160f11dcb2-300x300.png"",""mature"":false,""status"":""[GER] Perrick | SUB HYPE | DuoQ mit Kutcher dem Splasherboy"",""partner"":true,""url"":""http://www.twitch.tv/gurke4life"",""video_banner"":""http://static-cdn.jtvnw.net/jtv_user_pictures/gurke4life-channel_offline_image-04bbe533941011bd-640x360.png"",""_id"":43582520,""name"":""gurke4life"",""created_at"":""2013-05-15T22:36:05Z"",""updated_at"":""2015-02-11T16:17:55Z"",""delay"":0,""followers"":28407,""profile_banner"":null,""profile_banner_background_color"":null,""views"":605154,""language"":""de""}}}"
    8. 'hier wird dann der Resultstring Deserialisiert und "channel" in der veralteten Msgbox ausgegeben.
    9. Dim jread As jfile._links = Json.JsonConvert.DeserializeObject(Of jfile._links)(resultstring)
    10. MsgBox(jread.channel)
    11. 'der Teil hier unten war zum Testen, ob ich überhaupt an die Daten mit meinem jetzigen Weg ran komme und es Funktioniert.
    12. Dim reader As Json.JsonTextReader = New Json.JsonTextReader(New IO.StringReader(resultstring))
    13. While (reader.Read)
    14. If Not reader.Value = Nothing Then
    15. MetroPanelCategory1.TextSubline = MetroPanelCategory1.TextSubline & reader.Value & vbNewLine
    16. End If
    17. End While
    18. Return True
    19. End Function
    20. 'mein jämmerlicher Versuch eine Klasse in einer Klasse zu erstellen. hat nur leider nichts gebracht :D
    21. Public Class jfile
    22. Class _links
    23. Public Property self() As String
    24. Public Property channel() As String
    25. End Class
    26. End Class
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

    Linkai schrieb:

    Allerdings arbeite ich nicht mit C#, sondern mit .Net
    WHAT :?:
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Linkai schrieb:

    C#, sondern mit .Net


    Super! Ich nutze auch keinen Computer sondern einen Laptop! Und fahre nicht mit dem Fahrrad sondern mit nem Mountenbike.

    Was du meinst, wenn ich mir deinen Code anschaue ist: "Ich arbeite nicht mit C#.net sondern mit VB.net" (oder Kurz nicht mit C# sondern mit VB)
    Sprache = VB oder C#
    Framework = .net (3.x oder 4.x)
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Mein ich doch :P ich entschuldige mich für meine fehlerhafte Aussage :)

    Also: ich habe mir grad über den Links von @RodFromGermany die Klassen und Properties in C# erstellen lassen und habe diese nun an meinen Code angepasst.

    VB.NET-Quellcode

    1. Function get_infos(ByVal aktive_channel As Integer) As Boolean
    2. 'Hier wird der aktuell makierte Kanal ermittelt
    3. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    4. 'als nächtes wird der String in resultstring gespeichert
    5. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    6. 'und hier gegen meinen Teststring ausgetauscht
    7. ' resultstring = "{ ""channel"": ""https://api.twitch.tv/kraken/channels/gurke4life1"",""_links"":{""self"":""https://api.twitch.tv/kraken/streams/gurke4life"",""channel"":""https://api.twitch.tv/kraken/channels/gurke4life""},""stream"":{""_id"":13094757504,""game"":""League of Legends"",""viewers"":1536,""created_at"":""2015-02-11T14:33:40Z"",""_links"":{""self"":""https://api.twitch.tv/kraken/streams/gurke4life""},""preview"":{""small"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-80x45.jpg"",""medium"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-320x180.jpg"",""large"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-640x360.jpg"",""template"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-{width}x{height}.jpg""},""channel"":{""_links"":{""self"":""https://api.twitch.tv/kraken/channels/gurke4life"",""follows"":""https://api.twitch.tv/kraken/channels/gurke4life/follows"",""commercial"":""https://api.twitch.tv/kraken/channels/gurke4life/commercial"",""stream_key"":""https://api.twitch.tv/kraken/channels/gurke4life/stream_key"",""chat"":""https://api.twitch.tv/kraken/chat/gurke4life"",""features"":""https://api.twitch.tv/kraken/channels/gurke4life/features"",""subscriptions"":""https://api.twitch.tv/kraken/channels/gurke4life/subscriptions"",""editors"":""https://api.twitch.tv/kraken/channels/gurke4life/editors"",""videos"":""https://api.twitch.tv/kraken/channels/gurke4life/videos"",""teams"":""https://api.twitch.tv/kraken/channels/gurke4life/teams""},""background"":null,""banner"":null,""broadcaster_language"":""de"",""display_name"":""Gurke4life"",""game"":""League of Legends"",""logo"":""http://static-cdn.jtvnw.net/jtv_user_pictures/gurke4life-profile_image-da5c91160f11dcb2-300x300.png"",""mature"":false,""status"":""[GER] Perrick | SUB HYPE | DuoQ mit Kutcher dem Splasherboy"",""partner"":true,""url"":""http://www.twitch.tv/gurke4life"",""video_banner"":""http://static-cdn.jtvnw.net/jtv_user_pictures/gurke4life-channel_offline_image-04bbe533941011bd-640x360.png"",""_id"":43582520,""name"":""gurke4life"",""created_at"":""2013-05-15T22:36:05Z"",""updated_at"":""2015-02-11T16:17:55Z"",""delay"":0,""followers"":28407,""profile_banner"":null,""profile_banner_background_color"":null,""views"":605154,""language"":""de""}}}"
    8. 'der Teil hier unten war zum Testen, ob ich überhaupt an die Daten mit meinem jetzigen Weg ran komme und es Funktioniert.
    9. Dim reader As Json.JsonTextReader = New Json.JsonTextReader(New IO.StringReader(resultstring))
    10. While (reader.Read)
    11. If Not reader.Value = Nothing Then
    12. Me.Invoke(Sub() ListView1.Items.Add(reader.Value))
    13. End If
    14. End While
    15. 'hier wird dann der Resultstring Deserialisiert und "channel" in der veralteten Msgbox ausgegeben.
    16. Dim jread As Stream = Json.JsonConvert.DeserializeObject(Of Stream)(resultstring)
    17. MsgBox(jread.viewers)
    18. Return True
    19. End Function
    20. Public Class Links
    21. Public self() As String
    22. Public channel() As String
    23. End Class
    24. Public Class Links2
    25. Public self() As String
    26. End Class
    27. Public Class Preview
    28. Public small() As String
    29. Public medium() As String
    30. Public large() As String
    31. Public template() As String
    32. End Class
    33. Public Class Links3
    34. Public self() As String
    35. Public follows() As String
    36. Public commercial() As String
    37. Public stream_key() As String
    38. Public chat() As String
    39. Public features() As String
    40. Public subscriptions() As String
    41. Public editors() As String
    42. Public videos() As String
    43. Public teams() As String
    44. End Class
    45. Public Class Channel
    46. Public _links() As Links3
    47. Public background() As Object
    48. Public banner() As String
    49. Public broadcaster_language() As String
    50. Public display_name() As String
    51. Public game() As String
    52. Public logo() As String
    53. Public mature() As Boolean
    54. Public status() As String
    55. Public partner() As Boolean
    56. Public url() As String
    57. Public video_banner() As String
    58. Public _id() As Integer
    59. Public name() As String
    60. Public created_at() As String
    61. Public updated_at() As String
    62. Public delay() As Integer
    63. Public followers() As Integer
    64. Public profile_banner() As String
    65. Public profile_banner_background_color() As String
    66. Public views() As Integer
    67. Public language() As String
    68. End Class
    69. Public Class Stream
    70. Public _id() As Long
    71. Public game() As String
    72. Public viewers() As Integer
    73. Public created_at() As String
    74. Public _links() As Links2
    75. Public preview() As Preview
    76. Public channel() As Channel
    77. End Class
    78. Public Class RootObject
    79. Public _links() As Links
    80. Public stream() As Stream
    81. End Class



    Nun habe ich wie ihr oben sehen könnte versucht aus dem Stream _links auszulesen was : ich glaube 44 momentan sein müsste.

    allerdings kommt mein Code beim Deserialisieren zum stehen und verabschiedet sich mit folgender Fehlermeldung:
    Spoiler anzeigen
    {"Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'LA_Twitch.Links2[]' 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 '_links.self', line 1, position 18."}


    ich dreh echt durch T_T xD


    Edit: ich habe gerade bei Properties die Klammern entfernt. jetzt läuft der code Zwar durch und meine Msgbox geht wieder auf, aber sie ist wieder mal leer T_T

    Edit2: Okay ich habs ENDLICH :D xD
    Also für alle mit dem selben Problem:

    Saugt euch die Json.Net Lib von --> newtonsoft.com/json
    Importieren

    VB.NET-Quellcode

    1. Imports Newtonsoft


    Die Function für Twitch

    VB.NET-Quellcode

    1. Function get_infos(ByVal aktive_channel As Integer) As Boolean
    2. 'Hier wird der aktuell makierte Kanal ermittelt
    3. Dim akt_channel As String = Me.Invoke(Function() ListView1.Items.Item(aktive_channel).Text)
    4. 'als nächtes wird der String in resultstring gespeichert
    5. Dim resultstring As String = wc.DownloadString(server & "/streams/" & akt_channel)
    6. 'und hier gegen meinen Teststring ausgetauscht
    7. ' resultstring = "{ ""channel"": ""https://api.twitch.tv/kraken/channels/gurke4life1"",""_links"":{""self"":""https://api.twitch.tv/kraken/streams/gurke4life"",""channel"":""https://api.twitch.tv/kraken/channels/gurke4life""},""stream"":{""_id"":13094757504,""game"":""League of Legends"",""viewers"":1536,""created_at"":""2015-02-11T14:33:40Z"",""_links"":{""self"":""https://api.twitch.tv/kraken/streams/gurke4life""},""preview"":{""small"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-80x45.jpg"",""medium"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-320x180.jpg"",""large"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-640x360.jpg"",""template"":""http://static-cdn.jtvnw.net/previews-ttv/live_user_gurke4life-{width}x{height}.jpg""},""channel"":{""_links"":{""self"":""https://api.twitch.tv/kraken/channels/gurke4life"",""follows"":""https://api.twitch.tv/kraken/channels/gurke4life/follows"",""commercial"":""https://api.twitch.tv/kraken/channels/gurke4life/commercial"",""stream_key"":""https://api.twitch.tv/kraken/channels/gurke4life/stream_key"",""chat"":""https://api.twitch.tv/kraken/chat/gurke4life"",""features"":""https://api.twitch.tv/kraken/channels/gurke4life/features"",""subscriptions"":""https://api.twitch.tv/kraken/channels/gurke4life/subscriptions"",""editors"":""https://api.twitch.tv/kraken/channels/gurke4life/editors"",""videos"":""https://api.twitch.tv/kraken/channels/gurke4life/videos"",""teams"":""https://api.twitch.tv/kraken/channels/gurke4life/teams""},""background"":null,""banner"":null,""broadcaster_language"":""de"",""display_name"":""Gurke4life"",""game"":""League of Legends"",""logo"":""http://static-cdn.jtvnw.net/jtv_user_pictures/gurke4life-profile_image-da5c91160f11dcb2-300x300.png"",""mature"":false,""status"":""[GER] Perrick | SUB HYPE | DuoQ mit Kutcher dem Splasherboy"",""partner"":true,""url"":""http://www.twitch.tv/gurke4life"",""video_banner"":""http://static-cdn.jtvnw.net/jtv_user_pictures/gurke4life-channel_offline_image-04bbe533941011bd-640x360.png"",""_id"":43582520,""name"":""gurke4life"",""created_at"":""2013-05-15T22:36:05Z"",""updated_at"":""2015-02-11T16:17:55Z"",""delay"":0,""followers"":28407,""profile_banner"":null,""profile_banner_background_color"":null,""views"":605154,""language"":""de""}}}"
    8. 'der Teil hier unten war zum Testen, ob ich überhaupt an die Daten mit meinem jetzigen Weg ran komme und es Funktioniert.
    9. Dim reader As Json.JsonTextReader = New Json.JsonTextReader(New IO.StringReader(resultstring))
    10. While (reader.Read)
    11. If Not reader.Value = Nothing Then
    12. Me.Invoke(Sub() ListView1.Items.Add(reader.Value))
    13. End If
    14. End While
    15. 'hier wird dann der Resultstring Deserialisiert und "channel" in der veralteten Msgbox ausgegeben.
    16. Dim jread As RootObject = Json.JsonConvert.DeserializeObject(Of RootObject)(resultstring)
    17. MsgBox(jread.stream.game)
    18. Return True
    19. End Function



    und die erstellten Klassen basierend auf dem JSON-String. Convertiert mit- > json2csharp.com/

    VB.NET-Quellcode

    1. Public Class Links
    2. Public self As String
    3. Public channel As String
    4. End Class
    5. Public Class Links2
    6. Public self As String
    7. End Class
    8. Public Class Preview
    9. Public small As String
    10. Public medium As String
    11. Public large As String
    12. Public template As String
    13. End Class
    14. Public Class Links3
    15. Public self As String
    16. Public follows As String
    17. Public commercial As String
    18. Public stream_key As String
    19. Public chat As String
    20. Public features As String
    21. Public subscriptions As String
    22. Public editors As String
    23. Public videos As String
    24. Public teams As String
    25. End Class
    26. Public Class Channel
    27. Public _links As Links3
    28. Public background As Object
    29. Public banner As String
    30. Public broadcaster_language As String
    31. Public display_name As String
    32. Public game As String
    33. Public logo As String
    34. Public mature As Boolean
    35. Public status As String
    36. Public partner As Boolean
    37. Public url As String
    38. Public video_banner As String
    39. Public _id As Integer
    40. Public name As String
    41. Public created_at As String
    42. Public updated_at As String
    43. Public delay As Integer
    44. Public followers As Integer
    45. Public profile_banner As String
    46. Public profile_banner_background_color As String
    47. Public views As Integer
    48. Public language As String
    49. End Class
    50. Public Class Stream
    51. Public _id As Long
    52. Public game As String
    53. Public viewers As Integer
    54. Public created_at As String
    55. Public _links As Links2
    56. Public preview As Preview
    57. Public channel As Channel
    58. End Class
    59. Public Class RootObject
    60. Public _links As Links
    61. Public stream As Stream
    62. End Class


    :) ich habs mir wie immer mal schwerer gemacht und viel weiter gedacht als ich sollte ;) danke an alle für ihre Hilfe :)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

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