JSON Key-Value

    • VB.NET

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von mbfan.

      JSON Key-Value

      Hallo,
      für die einfache Speicherung von Einstellung in einem JSON-String hab ich mir eine kleine Klasse geschrieben, die ich euch auch zur Verfügung stellen will.
      Spoiler anzeigen

      VB.NET-Quellcode

      1. ​Imports Newtonsoft.Json.Linq
      2. Namespace Helpers
      3. Public Class JSONKeyValue
      4. Private data As JObject
      5. ''' <summary>
      6. ''' Gibt ein Objekt aus dem JSON aus
      7. ''' </summary>
      8. ''' <typeparam name="T">Objekttyp, als welches das Objekt ausgegeben werden soll</typeparam>
      9. ''' <param name="key">Key des Objektes</param>
      10. ''' <param name="standard">Standardwert, wird bei Fehler gesetzt und zurückgegeben</param>
      11. ''' <returns>Objekt aus dem JSON, bei Fehler standard</returns>
      12. Public Function getValue(Of T)(ByVal key As String, Optional ByVal standard As T = Nothing) As T
      13. Try
      14. Return data.SelectToken(key).ToObject(Of T)
      15. Catch ex As Exception
      16. setValue(Of T)(key, standard)
      17. Return standard
      18. End Try
      19. End Function
      20. ''' <summary>
      21. ''' Setzt einen Key auf Value oder fügt ihn hinzu.
      22. ''' </summary>
      23. ''' <typeparam name="T">Objekttyp des Objekts</typeparam>
      24. ''' <param name="key">Key des Objektes</param>
      25. ''' <param name="value">Value, auf das das Objekt im JSON gesetzt werden soll</param>
      26. Public Sub setValue(Of T)(ByVal key As String, ByVal value As T)
      27. Try
      28. data.SelectToken(key).Replace(JToken.FromObject(value))
      29. Catch
      30. If key.Contains(".") = False Then
      31. data.Add(key, JToken.FromObject(value))
      32. Else
      33. Dim actprob As JProperty = Nothing
      34. Dim dat() As String = key.Split("."c)
      35. For i As Integer = dat.Count - 1 To 0 Step -1
      36. If hasValue(String.Join(".", dat.Take(i + 1))) Then
      37. Dim jtoken As JToken = data.SelectToken(String.Join(".", dat.Take(i + 1)))
      38. jtoken.Last.AddAfterSelf(actprob)
      39. data.SelectToken(String.Join(".", dat.Take(i + 1))).Replace(jtoken)
      40. Exit For
      41. Else
      42. If actprob Is Nothing Then
      43. actprob = New JProperty(dat(i), value)
      44. Else
      45. Dim jo As New JObject
      46. jo.Add(actprob)
      47. Dim newprob As New JProperty(dat(i), jo)
      48. actprob = newprob
      49. End If
      50. If i = 0 Then
      51. data.Add(actprob)
      52. Exit For
      53. End If
      54. End If
      55. Next
      56. End If
      57. End Try
      58. End Sub
      59. ''' <summary>
      60. ''' Gibt zurück, ob der Key existiert
      61. ''' </summary>
      62. ''' <param name="key">Key des Objektes</param>
      63. ''' <returns>Angabe, ob das Objekt existiert</returns>
      64. Public Function hasValue(ByVal key As String) As Boolean
      65. Try
      66. Dim t As Object = data.SelectToken(key).ToObject(Of Object)
      67. Return True
      68. Catch
      69. Return False
      70. End Try
      71. End Function
      72. ''' <summary>
      73. ''' Entfernt einen Key aus dem JSON
      74. ''' </summary>
      75. ''' <param name="key">Key des zu entfernenden Objektes</param>
      76. Public Sub removeValue(ByVal key As String)
      77. data.Remove(key)
      78. End Sub
      79. ''' <summary>
      80. ''' Erstellt ein neues leeres KeyValue-JSON
      81. ''' </summary>
      82. Public Sub New()
      83. data = JObject.Parse("{}")
      84. End Sub
      85. ''' <summary>
      86. ''' Erstellt ein neues KeyValue aus einen JSON-String
      87. ''' </summary>
      88. ''' <param name="json">Der JSON-String, aus welchem das KeyValue-System erstellt werden soll</param>
      89. Public Sub New(ByVal json As String)
      90. data = JObject.Parse(json)
      91. End Sub
      92. ''' <summary>
      93. ''' Gibt den aktuellen JSON-String zurück
      94. ''' </summary>
      95. ''' <returns>aktuelles JSON</returns>
      96. Public Function toJson() As String
      97. Return data.ToString
      98. End Function
      99. ''' <summary>
      100. ''' Gibt das JObject aus, um es mit anderen Newtonsoft.Json-Funktionen zu verwalten
      101. ''' </summary>
      102. ''' <returns>JObject des aktuellen JSONs</returns>
      103. Public ReadOnly Property JSON As JObject
      104. Get
      105. Return data
      106. End Get
      107. End Property
      108. End Class
      109. End Namespace

      Die Klasse benötigt Newtonsoft.Json.
      Zur Verwendung
      Der Json-String muss in einem solchen Format vorliegen:

      Quellcode

      1. ​{
      2. "ClientKey": "123",
      3. "TelemetryIP": "127.0.0.1",
      4. "msgbox": {
      5. "login": true
      6. },
      7. "expander": {
      8. "truck": true,
      9. "drive": true,
      10. "task": true,
      11. "driver": {
      12. "default": true,
      13. "peter35": true
      14. }
      15. }
      16. }

      Hierbei ist die Verschachtelungstiefe erstmal egal.
      Zuerst muss ein Objekt der Klasse erstellt werden:

      VB.NET-Quellcode

      1. Dim json As New JsonKeyValue(jsonstring)​

      Um nun zum Beispiel auf den Wert von "peter35" zuzugreifen, muss nun die folgende Methode aufgerufen werden:

      VB.NET-Quellcode

      1. ​json.getValue(Of Boolean)("expander.driver.peter35", False)
      Hierbei ist False der Wert, der zurückgegeben wird, sollte kein Eintrag vorhanden sein.
      Um einen Wert zu ändern, muss die folgende Methode aufgerufen werden:

      VB.NET-Quellcode

      1. ​json.setValue(Of Boolean)("expander.driver.peter35", True)

      Ob ein Wert vorhanden ist, kann so überprüft werden:

      VB.NET-Quellcode

      1. ​json.hasValue("expander.driver.peter35")

      Ein Wert entfernt werden kann mittels

      VB.NET-Quellcode

      1. ​json.removeValue("expander.driver.peter35")

      Um den "fertigen" JSON (bspw. zum Speichern) zu erhalten, kann die folgende Funktion verwendet werden:

      VB.NET-Quellcode

      1. ​json.toJson()

      Und zu guterletzt kann mittels der Property JSON ein JObject erhalten werden, um es mit anderen Newtonsoft.Json-Funktion weiterzuverarbeiten.

      Ich hoffe, ihr könnt damit was anfangen ;)
      Nico
      You should live for that what you belive. - Drag-Drop Beschreibung
      Und was genau ist nun besser an deiner Vorgehensweise, gegenüber einer Settings Klasse, die ich einfach am Start der Anwendung via JSON einlese (sofern vorhanden) und am Ende bzw. bei Veränderungen von Werten wieder als JSON abspeichere?
      Auf deinen Weg benötige ich ja Schlüssel, die ich mir irgendwie merken muss... am Besten als Konstanten in einer Klasse namens SettingsKeys ... wo wir wieder beim Thema sind.

      Wo ich deinen Weg schonmal gesehen habe, ist in einem NuGet, für die Xamarin Entwicklung, das Cross-Plattform Settings anbietet. Dort hat man auch diese Methoden, die dann jedoch unter der Haube den plattformspezifischen Settings-Provider kontaktieren.
      Die angelegte Helper-Klasse hat dann jedoch selbst vorgeschlagen, das ganze Schlüssel- und Default- bzw. Standardzeug hinter einer Property zu verstecken, sodass man damit nicht im eigentlichen Code zu kämpfen hat.

      Edit:
      Benutzt du immer CamelCase für deine Funktionen? Das ist in der .NET Welt eigentlich eher unüblich:
      docs.microsoft.com/en-us/dotne…apitalization-conventions

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

      Hallo,

      die Klasse wurde geschrieben, um auf JSON-Objekte sinnvoll zuzugreifen, die in einer Datenbank gespeichert sind und auch aus PHP abrufbar sein sollen. Wenn das nicht der sinnvollste Weg ist, ist das vollkommen okay, ich wollte nur den Code nicht verschimmeln lassen.
      Mit dem CamelCase: Das habe ich mir mal so angewöhnt vor Jahren - und das ist immer sehr schwer aus einem herauszubekommen.
      Nico
      You should live for that what you belive. - Drag-Drop Beschreibung