JObject Parse

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

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von Pixxxas.

    Kleiner Tipp.

    Wenn du einen JSON String volriegen hast,
    eine Klasse implementieren "lassen" von Visual Studio.

    Menü: Bearbeiten -> Inhalte einfügen -> JSON als Klassen einfügen

    Dann nochmals refaktorieren (wichtig)!!!

    Dann gehts das auch mit dem JSON, der Nachbarin und oder Nachbarn... ;)

    Serialisierung und Deserialisierung; ist doch nur ein Objekt (war mal im RAM) das geschrieben steht,
    und dann Tranpsortiert wird und dann deserialisiert Mann/Frau/Divers die Nachricht zurück in einer RAM. ;)

    c.u. Joshi
    @mrMo
    mit

    VB.NET-Quellcode

    1. MsgBox(packet.Message)
    erhalte ich die ganze Server Message (siehe Bild)
    mit

    VB.NET-Quellcode

    1. MsgBox(packet.MaxPlayers)
    erhalte ich 0 zurück, müsste aber 2 sein (siehe Bild)

    VB.NET-Quellcode

    1. Imports Newtonsoft.Json
    2. Namespace RustTool.WebSockets
    3. Public Class Packet
    4. Public Sub New(message As String, identifier As Integer, ByVal Optional name As String = "RustTool")
    5. Me.Message = message
    6. Me.Identifier = identifier
    7. Me.Name = name
    8. MaxPlayers = MaxPlayers
    9. End Sub
    10. <JsonProperty("Identifier")>
    11. Public Property Identifier As Integer
    12. <JsonProperty("Message")>
    13. Public Property Message As String
    14. <JsonProperty("Name")>
    15. Public Property Name As String
    16. <JsonProperty("MaxPlayers")>
    17. Public Property MaxPlayers As Integer
    18. End Class
    19. End Namespace
    Bilder
    • 1.png

      15,48 kB, 609×543, 49 mal angesehen
    Bitte richtig lesen. Mein erster Satz aus Post #25 ist nach "String" nicht zu ende. Ich präzisiere mal: Message darf kein String sein, sondern vom Typ einer von dir zu erstellenden Klasse. Die neue Klasse muss die Eigenschaften aus deinem Bild besitzen, die du verwenden möchtest (Hostname, MaxPlayers, usw.).
    Ist doch gar nicht so schwer. Die Eigenschaft Message in deiner Klasse Packet darf kein String sein, sondern muss den Typ einer neuen, von dir zu erstellenden Klasse bekommen. Und warum das Ganze?
    Nimm dein JSON mal auseinander: Mit { } wird in JSON ein Objekt definiert.

    Quellcode

    1. {
    2. "Message": {
    3. ...
    4. },
    5. "Identifier": 1,
    6. "Type": "Generic",
    7. "Stacktrace": ""
    8. }

    Das repräsentiert deine Klasse Packet. Die hast du ja schon angelegt. Grundsätzlich ist in diesem JSON mit "Message" ein weiteres Objekt enthalten.

    Quellcode

    1. ​{
    2. "Hostname": "[EU/GER] Test Server",
    3. "MaxPlayers": 2,
    4. "Players": 0,
    5. "Queued": 0,
    6. "Joining": 0,
    7. "EntityCount": 85486,
    8. "GameTime": "06/14/2024 23:03:17",
    9. "Uptime": 1145,
    10. "Map": "Procedural Map",
    11. "Framerate": 237.0,
    12. "Memory": 1412,
    13. "Collections": 137,
    14. "NetworkIn": 0,
    15. "NetworkOut": 0,
    16. "Restarting": false,
    17. "SaveCreatedTime": "01/06/2022 23:17:08"
    18. }

    Dafür benötigst du eine neue Klasse, damit die Werte beim Deserialisieren in deinem Objekt landen. Denn hier steht dein gesuchter Wert für "MaxPlayers".
    meinst du so?

    VB.NET-Quellcode

    1. <JsonProperty("Message")>
    2. Public Property Message As Object
    3. <JsonProperty("MaxPlayers")>
    4. Public Property MaxPlayers As Integer

    so bekomme ich nur 0 zurück.

    Sorry, aber ich weiß nicht mehr weiter.
    Für Leute wie euch, die das können, mag es einfach sein, aber ich weiß nicht mehr weiter.
    Inseriere doch im Marktplatz da findest bestimmt jemanden der dir fertigen Code schickt.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Programmieren ist halt nicht einfach. Muss man viel Eigeninitiative aufbringen um sich Themen zu erarbeiten. Aber ist halt auch viel einfacher im Forum zu fragen als selbst zu recherchieren oder die Grundlagen zu lernen …

    Ich finde @ISliceUrPanties hat da recht gut erklärt was zu tun ist.

    Newtonsoft hat hier auch relativ viel erklärt newtonsoft.com/json/help/html/Samples.htm

    Der JSON String spiegelt ein Objekt wieder, dessen Aufbau von dir in Form einer Klasse nachgebaut werden muss. Dazu musst du das Datenmodell kennen. Dieses Wiederum kann man anhand des JSON Objekts erkennen. Es gibt sogar Konverter, die dir aus einem JSON String eine fertige Klasse generieren. Jemand hier im Thread hat sogar gesagt, dies ginge direkt in Visual Studio wobei ich da nicht weiß wo/wie.

    Infos sind eigentlich alle da, es liegt nun an dir ...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Beide Wege sind richtig und okay, je nachdem was man will.
    Wie ziemlich am Anfang schon beschrieben, kann man sich mit "LINQ to JSON" behelfen, wenn man wirklich nur einen Wert braucht.
    Braucht man vielleicht mehr aus den Klassen, dann muss man diese auch erst erzeugen. Es gibt auch im Internet diverse Tools die dir aus einem JSON eine Klassenstruktur bauen.

    Also 2 Wege, beide sind kein Problem, immer mit dem korrekten String, einmal ohne Klasse, einmal mit.
    Der schon ganz am Anfang dargestellte String war nicht 100% in Ordnung, aber das war mit einem Auge zugehalten bereits erkennbar. Und zudem wollen die Programmiersprachen ganz gerne, dass man das Anführungszeichen escaped, aber egal. Ich zeige hier weder den bereinigten String noch die Klasse. Aber der hier gezeigte Code funktioniert.

    LINQ to JSON

    VB.NET-Quellcode

    1. Dim o As JObject = JObject.Parse(jstring)
    2. Dim maxPlayers As String = CStr(o.SelectToken("Message.MaxPlayers"))
    3. MessageBox.Show(maxPlayers)


    deserialized JSON

    VB.NET-Quellcode

    1. Dim application As New Application 'Ja die Klasse heißt so unglücklich
    2. application = JsonConvert.DeserializeObject(Of Application)(jstring)
    3. MessageBox.Show(application.Message.MaxPlayers.ToString)

    @Dksksm da erhalte ich nur eine leere msgbox zurück, wie zuvor auch.

    @mrMo wenn ich z.b. die json bei jsonutils.com/ rein Kopiere, genauso wie ich sie vor Server erhalte, wird mir ein Fehler zurückgegeben. (Invalid JSON Syntax )

    Ihr könnt euch das gerne mal angucken und selber rum spielen, Server lasse ich laufen.

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

    Du erhältst vielleicht eine leere MessageBox zurück, ich aber nicht, sonst hätte ich nicht geschrieben, dass der Code läuft, ausserdem habe ich das auch mit anderen Properties der Klasse Message getestet.
    Dein String ist halt falsch, was nicht nur ich in dem gesamten Thread hier schon geschrieben habe.
    Fürs erste Beispiel brauchst du "nur" den korrekt funktionierenden String, welcher ge-parsed wird und für das zweite Beispiel brauchst du zusätzlich noch die beiden Klassen Application und Message, wie auch @ISliceUrPanties erklärt hat. Wenn man es richtig macht bekommt man auch Ergebnisse. Das du kein Ergebnis bekommt liegt nicht an dem gezeigten Code!
    z.b. jetzt hier;

    VB.NET-Quellcode

    1. Dim o As JObject = JObject.Parse(e.Data) '<- Kopiert die Daten aus e.data in ein Jobect
    2. Dim maxPlayers As String = CStr(o.SelectToken("Message.MaxPlayers")) '<-wandelt maxplayers in ein string. springt in Message zu MaxPlayers
    3. MessageBox.Show(maxPlayers) '<- gibt MaxPlayers aus


    richtig?
    Ja, sofern in e.Data das steht, was du glaubst was da drinnen steht. Tut es aber nicht

    VB.NET-Quellcode

    1. Dim jstring As String = e.Data
    2. MessageBox.Show(jstring)
    3. Dim o As JObject = JObject.Parse(jstring)

    Das ist, was e.Data tatsächlich enthält, mit genau diesen Zeichen. Wäre der String für C#...
    { "Message": "{\r\n \"Hostname\": \"[EU/GER] RustyBeach Test Server\",\r\n \"MaxPlayers\": 2,\r\n \"Players\": 0,\r\n \"Queued\": 0,\r\n \"Joining\": 0,\r\n \"EntityCount\": 102899,\r\n \"GameTime\": \"07/12/2024 10:50:02\",\r\n \"Uptime\": 5639,\r\n \"Map\": \"Procedural Map\",\r\n \"Framerate\": 30.0,\r\n \"Memory\": 1622,\r\n \"Collections\": 145,\r\n \"NetworkIn\": 0,\r\n \"NetworkOut\": 0,\r\n \"Restarting\": false,\r\n \"SaveCreatedTime\": \"01/06/2022 23:17:08\"\r\n}", "Identifier": 1, "Type": "Generic", "Stacktrace": "" }

    So sollte der String aussehen damit es funktioniert:
    {"Message": { "Hostname": "[EU/GER] Test Server", "MaxPlayers": 2, "Players": 0, "Queued": 0, "Joining": 0, "EntityCount": 85486, "GameTime": "06/14/2024 23:03:17", "Uptime": 1145, "Map": "Procedural Map", "Framerate": 237.0, "Memory": 1412, "Collections": 137, "NetworkIn": 0, "NetworkOut": 0, "Restarting": false, "SaveCreatedTime": "01/06/2022 23:17:08"}, "Identifier": 1, "Type": "Generic", "Stacktrace": ""}

    Nachtrag:

    Mit folgendem Würgaround würde es gehen:

    VB.NET-Quellcode

    1. Dim jstring As String = e.Data
    2. jstring = jstring.Replace("\r\n", Environment.NewLine)
    3. jstring = jstring.Replace("\", "")
    4. jstring = jstring.Replace("""{", "{")
    5. jstring = jstring.Replace("}""", "}")
    6. MessageBox.Show(jstring)
    7. Dim o As JObject = JObject.Parse(jstring)
    8. Dim maxPlayers As String = CStr(o.SelectToken("Message.MaxPlayers"))
    9. MessageBox.Show(maxPlayers)


    Nachtrag zum Nachtrag:
    Also das ganze hat mit dem Projekt Sharpcon aus deinem Beitrag 10 nichts zu tun. Du versuchst 2 Projekte, oder Informationen daraus zu verquirlen, das ist jedenfalls mein Eindruck.
    Das Detail an dem wir da grade rum hühner ist aber nur ein kleiner Teil des Gesamtproblems was du dir da aufzubauen versuchst. Du wirst, selbst wenn das hier ohne Workaround klappen sollte, sofort an der nächsten Ecke die Nase blutig hauen. Deine Klasse stimmt nicht und die wirst du auch nicht mit einem Handgriff passend machen. Wobei, die Klasse(n) (sind ja 2) sind eigentlich kein Problem, aber für dich offensichtlich doch und was noch schlimmer ist, das ganze Konstrukt drum herum.
    Ich bin raus.

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