Json Datei auslesen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von MVN050.

    Json Datei auslesen

    Hallo Leute

    Ich habe noch nie etwas mit Json gemacht und brauche jetzt mal eure hilfe. Für ein Spiel gibt es eine Serverliste und diese Liste wird in eine Json (JSP) Datei gespeichert und auf einer Website angezeigt.
    Jetzt will ich natürlich alle Gameserver von diesem Spiel haben und diese in eine Liste anzeigen. Ich habe jetzt aber leider noch nie etwas mit Json gemacht und weiss auch garnich wie man die so richtig auslesen kann bzw was da der einfachste Weg wäre?
    Das für mich erstmal schwirige ist das die Anzahl der Server in der Datei dynamisch ist. Das heisst das zu jedem zeitpunkt mehr bzw weniger Server in der Liste stehen könne. Gibt es da eine einfache Methode um erstmal die Anzahl rauszufinden? Danach kann man ja mit einer Art Schleife die Server durchgehen und anzeigen oder?

    Ich habe jetz schon mehrmals diesen Json.NET von Newtonsoft gefunden. Hat jemand Erfahrung damit gemacht und is der einfach zu bedienen?

    Die Datei habe ich euch mal in dne Anhang gepackt.
    Dateien
    • servers.jsp.zip

      (995 Byte, 181 mal heruntergeladen, zuletzt: )
    Hi,

    im Grunde recht einfach. Ich nutze meist diese Seite, um mir die entsprechenden Klassen erstellen zu lassen. Sollte im Grunde selbsterklärend sein. JSON ist ja ein recht einfaches Format.

    quicktype.io


    Auf der linken Seite den JSON-String eintragen und im rechten Teil die gewünschte Sprache. Im Code findest Du dann auch, welche Aufrufe an JSON.Net nötig sind.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX
    Ich habe mir schon gedacht das es nich wirklich schwer sein kann. Aber irgendwie hab ich das Gefühlt das deine Seite mir nicht den richtigen Quellcode liefert bzw irgendwie etwas das ich garnich will? Kann das sein? Zuerst erstellt er mir 2 public partial class xxxx Das verstehe ich ja noch. Aber dann macht er irgendwas mit der Gameversion das für mich irgendwie garkein Sinn ergibt? Ich will die Gameversion zwar auslesen können aber nich nur die Gameversion sondern irgendwie doch Angaben von diesem einen Server? Und ich will doch ALLE Angaben von ALLEn Servern von der Liste und nicht nur von einem? Mein Hintergedanke ist das mein Masterserver alle Server bekommt und diese an alle Spieler weiter schickt. Damit die Sieler die neue Liste bekommen. Momentan muss sich jeder Spieler die Liste selber besorgen und es kommt öfters vor das der Webserver wegen Überastung den Betrieb einstellt :D

    Quellcode

    1. static class GameVersionExtensions
    2. {
    3. public static GameVersion ReadJson(JsonReader reader, JsonSerializer serializer)
    4. {
    5. switch (serializer.Deserialize<string>(reader))
    6. {
    7. case "Open Beta 5.293": return GameVersion.OpenBeta5293;
    8. }
    9. throw new Exception("Unknown enum case");
    10. }
    11. public static void WriteJson(this GameVersion value, JsonWriter writer, JsonSerializer serializer)
    12. {
    13. switch (value)
    14. {
    15. case GameVersion.OpenBeta5293: serializer.Serialize(writer, "Open Beta 5.293"); break;
    16. }
    17. }
    18. }
    ich find die dort generierten Klassen ziemlich Klasse.
    Aber was ist das für ein Code, den du da einstellst? Ist der generiert oder hast du ihn dir ausgedacht? funktioniert das?

    Also mir sieht das aus wie ein ganz disfunktionaler Versuch.
    In meiner Welt würde man die ganze Datei einmal einlesen in ein Objektmodell - eben was dir generiert wurde.
    Und dann hast du ein Array von Server-Objekten, kannst auf jedes zugreifen, und Properties abrufen - was wolle.
    Also nicht für jede popelige Property die Deserialisierung einer Datei abfahren, sondern ein Mal, und danach wird nurnoch das Objektmodell ausgewertet.
    Hi,

    find ich auch etwas seltsam, warum er bei "GameVersion" nicht einfach String als Datentyp nimmt. Kannst ja einfach abändern. Also im folgenden Beispiel erhalte ich eine Liste, die alle 14 Server mit ihren jeweiligen Settings beinhaltet.

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using Newtonsoft.Json;
    7. using System.IO;
    8. namespace ConsoleApp4
    9. {
    10. class Program
    11. {
    12. static void Main(string[] args)
    13. {
    14. string data = File.ReadAllText("servers.jsp.json");
    15. List<Server> servers = JsonConvert.DeserializeObject<List<Server>>(data);
    16. }
    17. }
    18. public partial class Server
    19. {
    20. [JsonProperty("Bots")]
    21. public long Bots { get; set; }
    22. [JsonProperty("Current Map")]
    23. public string CurrentMap { get; set; }
    24. [JsonProperty("Game Version")]
    25. public string GameVersion { get; set; }
    26. [JsonProperty("IP")]
    27. public string IP { get; set; }
    28. [JsonProperty("Name")]
    29. public string Name { get; set; }
    30. [JsonProperty("Players")]
    31. public long Players { get; set; }
    32. [JsonProperty("Port")]
    33. public long Port { get; set; }
    34. [JsonProperty("Variables")]
    35. public Variables Variables { get; set; }
    36. }
    37. public partial class Variables
    38. {
    39. [JsonProperty("bAllowPrivateMessaging")]
    40. public bool BAllowPrivateMessaging { get; set; }
    41. [JsonProperty("bAutoBalanceTeams")]
    42. public bool BAutoBalanceTeams { get; set; }
    43. [JsonProperty("bPassworded")]
    44. public bool BPassworded { get; set; }
    45. [JsonProperty("bPrivateMessageTeamOnly")]
    46. public bool BPrivateMessageTeamOnly { get; set; }
    47. [JsonProperty("bSpawnCrates")]
    48. public bool BSpawnCrates { get; set; }
    49. [JsonProperty("bSteamRequired")]
    50. public bool BSteamRequired { get; set; }
    51. [JsonProperty("CrateRespawnAfterPickup")]
    52. public long CrateRespawnAfterPickup { get; set; }
    53. [JsonProperty("Mine Limit")]
    54. public long MineLimit { get; set; }
    55. [JsonProperty("Player Limit")]
    56. public long PlayerLimit { get; set; }
    57. [JsonProperty("Team Mode")]
    58. public long TeamMode { get; set; }
    59. [JsonProperty("Time Limit")]
    60. public long TimeLimit { get; set; }
    61. [JsonProperty("Vehicle Limit")]
    62. public long VehicleLimit { get; set; }
    63. }
    64. }


    @ErfinderDesRades

    Es gibt ja eine Reihe von Tools, die Dir aus einem JSON-String das entsprechende Objektmodell generieren. Einfach pure Faulheit, um es nicht selber machen zu müssen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX
    Vielen dank! ich war da wohl komplett aufem Holzweg und bin eigentlich davon ausgegangen das ich mehrere Mehoden von diesem Newton Json brauche bzw ausführen muss um die Array List zu erstellen. Manchmal is es wirklich viel einfacher als man denkt :D
    Die "Gameversion" Methode hat er mir so erstellt (+ die Klassen) und das hat mich total verwirrt. Und zwar nur die Klassen und diese Methode der Gameversion...sonst nichts... Das hat natürlich nicht wirklich funktioniert. Mehr als deinen Quellcode woll ich doch garnich.

    @ErfinderDesRades
    Die Klassen sind wirklich super! aber diesen Quellcode (den ich gepostet hatte) hat mir die Seite genau so erstellt und hat mich komplett verwirrt.