Steam API + Cannot deserialize the current JSON + kleine Frage

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

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von CroNeX.

    Steam API + Cannot deserialize the current JSON + kleine Frage

    Moin Freunde, da bin ich wieder und habe wieder ein Problem und hoffe Ihr könnt mir weiterhelfen.
    Ich versuche eine Abgefragte Json Webseite zu deseriaisieren habe aber diesen Fehler bekommen und hoffe Ihr könnt mir dabei helfen.

    Quellcode

    1. + $exception {"Cannot deserialize the current JSON object (e.g. {""name"":""value""}) into type 'Test_Steam_Stats.Stat[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly." & vbCrLf & "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." & vbCrLf & "Path 'playerstats.stats.deaths', line 1, position 78."} Newtonsoft.Json.JsonSerializationException


    Die Datei Packe ich in den Anhang.

    Wenn dies Problem gelöst ist, habe ich noch eins.
    Ich möchte die verschiedenen Namen + Value in unterschiedlichen Labels ausgeben ( ja mit richtextbox etc gehts besser ist grad auch nur zur probe, aber ich möchte das so haben :P)
    Die Werte die ich bekomme sind die hier:

    Quellcode

    1. {"playerstats":{"steamID":"76561198140246388","gameName":"","stats":[{"name":"deaths","value":82},{"name":"bullet_fired","value":1106},{"name":"arrow_fired","value":384},{"name":"item_drop","value":926},{"name":"death_suicide","value":30},{"name":"kill_player","value":64},{"name":"bullet_hit_player","value":177},{"name":"arrow_hit_entity","value":40},{"name":"harvest.stones","value":70271},{"name":"bullet_hit_entity","value":156},{"name":"harvest.cloth","value":634},{"name":"harvest.wood","value":181935},{"name":"arrow_hit_building","value":18},{"name":"kill_bear","value":2},{"name":"kill_boar","value":1},{"name":"kill_stag","value":2},{"name":"kill_chicken","value":1},{"name":"kill_wolf","value":1},{"name":"headshot","value":90},{"name":"arrow_hit_boar","value":30},{"name":"arrow_hit_bear","value":38},{"name":"arrow_hit_stag","value":1},{"name":"bullet_hit_building","value":114},{"name":"arrow_hit_horse","value":6},{"name":"arrow_hit_player","value":78},{"name":"death_entity","value":12},{"name":"death_bear","value":3},{"name":"shotgun_fired","value":5},{"name":"shotgun_hit_player","value":1},{"name":"bullet_hit_bear","value":18},{"name":"bullet_hit_horse","value":14},{"name":"bullet_hit_wolf","value":29},{"name":"bullet_hit_boar","value":20},{"name":"wounded","value":35},{"name":"wounded_assisted","value":4},{"name":"wounded_healed","value":1},{"name":"bullet_hit_playercorpse","value":1},{"name":"bullet_hit_corpse","value":1}]}}


    wie unterscheide ich von den ganzen namen und Values um sie richtig zu sortieren und zu zu ordnen ?

    Danke Danke Danke
    Dateien
    Hmm..

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Newtonsoft
    2. Public Class Form1
    3. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    4. Dim jsonString As String = IO.File.ReadAllText("TextFile1.txt")
    5. Debug.WriteLine(jsonString)
    6. Dim _example As _JSON = Json.JsonConvert.DeserializeObject(Of _JSON)(jsonString)
    7. Debug.WriteLine("steamID: " & _example.playerstats.steamID)
    8. Debug.WriteLine("gameName: " & _example.playerstats.gameName)
    9. For Each _plStat In _example.playerstats.stats
    10. Debug.WriteLine("name: " & _plStat.name & " - value: " & _plStat.value)
    11. Next
    12. End Sub
    13. End Class
    14. Public Class Stat
    15. Public Property name As String
    16. Public Property value As Integer
    17. End Class
    18. Public Class Playerstats
    19. Public Property steamID As String
    20. Public Property gameName As String
    21. Public Property stats As Stat()
    22. End Class
    23. Public Class _JSON
    24. Public Property playerstats As Playerstats
    25. End Class
    Moin,

    von der SteamAPI kommt anderer JSON zurück als den du gepostet hast.
    Von der SteamAPI kommt das hier:
    Spoiler anzeigen

    Quellcode

    1. {"playerstats":{"steamID":"76561198140246388","gameName":"","stats":{"deaths":{"value":82},"bullet_fired":{"value":1106},"arrow_fired":{"value":384},"item_drop":{"value":926},"death_suicide":{"value":30},"kill_player":{"value":64},"bullet_hit_player":{"value":177},"arrow_hit_entity":{"value":40},"harvest.stones":{"value":70271},"bullet_hit_entity":{"value":156},"harvest.cloth":{"value":634},"harvest.wood":{"value":181935},"arrow_hit_building":{"value":18},"kill_bear":{"value":2},"kill_boar":{"value":1},"kill_stag":{"value":2},"kill_chicken":{"value":1},"kill_wolf":{"value":1},"headshot":{"value":90},"arrow_hit_boar":{"value":30},"arrow_hit_bear":{"value":38},"arrow_hit_stag":{"value":1},"bullet_hit_building":{"value":114},"arrow_hit_horse":{"value":6},"arrow_hit_player":{"value":78},"death_entity":{"value":12},"death_bear":{"value":3},"shotgun_fired":{"value":5},"shotgun_hit_player":{"value":1},"bullet_hit_bear":{"value":18},"bullet_hit_horse":{"value":14},"bullet_hit_wolf":{"value":29},"bullet_hit_boar":{"value":20},"wounded":{"value":35},"wounded_assisted":{"value":4},"wounded_healed":{"value":1},"bullet_hit_playercorpse":{"value":1},"bullet_hit_corpse":{"value":1}}}}


    /EDIT/ ganz vergessen den Grund zu erwähnen.
    Du nutzt die API v1 ( api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v1/ )
    in der API v2 ist es so wie du möchtest.

    Also müsstest du in deiner SteamHelper.vb die version auf Standard 2 setzten.

    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

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

    xChRoNiKx schrieb:


    Also müsstest du in deiner SteamHelper.vb die version auf Standard 2 setzten.


    ohh man danke, so ein kleiner fehler :/

    hast du noch eine lösung für mein anderes problem ? wie ich meine daten in verschiedenen labels anzeigen lassen kann ? denn ich habe ja nur "name" und "value" oder kann man dadrinne auch noch besonders nach namen filtern ?

    *Vollzitat entfernt* ~NoFear23m

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

    Moin,

    da gibt es sicherlich tausende Wege dies zu tun. Ich würde da nun in deiner playerstats Class das stats() auf ne List(of stat) abändern.
    Dann sparst du dir den .ToList.
    Und dann könnte man per .Find da nach dem namen suchen.

    Dim stat = gi.playerstats.stats.Find(Function(f) f.name = "deaths")

    Wird sicherlich noch ne bessere Möglichkeit geben gehe ich von aus sollte die einer haben dann nur her damit.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Moin ich wieder, habe mal wieder was rumprobiert und brauche eure Hilfe.
    Ich benötige String.Contains
    Hiermit rufe ich die Namen + Werte ab

    Quellcode

    1. ​If gi.playerstats.stats.Find(Function(f) f.name = "headshot") Is Nothing then blalabla Else blablabla

    wie kann ich jetzt mit contains prüfen, ob überhaupt der "f.name = "headshot" im string enthalten ist ?
    Am Ende bekommt man doch True oder False raus, stimmts ?

    danke
    @CroNeX So was:

    VB.NET-Quellcode

    1. Dim str1 = "abcde"
    2. Dim str2 = "bcd"
    3. If str1.Contains(str2) Then
    4. MessageBox.Show("enthalten")
    5. End If
    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!

    CroNeX schrieb:

    in stats ist .name und.value enthalten
    Ja und?
    Wo liegt das Problem?
    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!
    @CroNeX Welcher String soll denn ja|nein in welchem anderen enthalten sein?
    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!
    Schon mal danke das du mir dabei hilfst. auf Seite 1 hatte ich mein Projekt schon als Anhang mal hochgeladen, falls du es visuell brauchst.
    Also, dadurch kommt mein abruf

    Quellcode

    1. ​Dim gi As ApiResponse = steamApi.GetApiResponse(SteamInterface.SteamUserStats, PlayerServiceMethods.GetUserStatsForGame, "steamId=" & steamID)

    damit bekomme ich meinen json-String. nun sind manche werte enthalten bei einer gewissen abgefragten ID und manche nicht, dass möchte ich filtern.
    damit filter ich ob der wert Nothing ist oder nicht

    Quellcode

    1. ​If gi.playerstats.stats.Find(Function(f) f.name = "arrow_fired") Is Nothing then blablabla

    nun möchte ich aber vorher wissen ob

    Quellcode

    1. ​"arrow_fired"
    überhaupt enthalten ist.