Reputation: 33
I have to serialize and deserialize a JSON string which is used by another program.
I know very little about JSON, so please be gentle with me.
The other program uses NewtonSoft.JSON to do this, but as this is the only thing I need NewtonSoft.JSON for, I would prefer to do it without using NewtonSoft.JSON, so I don't have to include the dll with my program.
The other program serializes like this:
Class TestSettings
Public Setting1 As Byte()
Public Setting2 As Byte()
End Class
Dim SettingsObj As Object = New TestSettings
SettingsObj.Setting1 = Encoding.ASCII.GetBytes("This is setting 1")
SettingsObj.Setting2 = Encoding.ASCII.GetBytes("This is setting 2")
Dim JSONString As String = JsonConvert.SerializeObject(SettingsObj)
'JSONString = {""Setting1"":""VGhpcyBpcyBzZXR0aW5nIDE="",""Setting2"":""VGhpcyBpcyBzZXR0aW5nIDI=""}
and deserializes like this:
'Just setting this to demonstrate.
Dim JSONContents As String = " {""Setting1"":""VGhpcyBpcyBzZXR0aW5nIDE="",""Setting2"":""VGhpcyBpcyBzZXR0aW5nIDI=""}"
Dim ReadsettingsObj = CType(JsonConvert.DeserializeObject(JSONContents, GetType(TestSettings)), TestSettings)
Dim Setting1String As String = Encoding.ASCII.GetString(ReadsettingsObj.Setting1)
Dim Setting2String As String = Encoding.ASCII.GetString(ReadsettingsObj.Setting2)
'Setting1String = "This is setting 1"
'Setting2String = "This is setting 2"
I've tried this for serialization:
Dim SettingsObj2 As Object = New TestSettings
SettingsObj2.Setting1 = Encoding.ASCII.GetBytes("This is setting 1")
SettingsObj2.Setting2 = Encoding.ASCII.GetBytes("This is setting 2")
Dim jss = New JavaScriptSerializer
Dim JSONString2 As String = jss.Serialize(SettingsObj2)
'JSONString2 = {""Setting1"":[84,104,105,115,32,105,115,32,115,101,116,116,105,110,103,32,49],""Setting2"":[84,104,105,115,32,105,115,32,115,101,116,116,105,110,103,32,50]}
...as you can see, the returned string is not the same, and for the deserialization, I've tried:
Dim jss2 As New JavaScriptSerializer
Dim Items = jss2.Deserialize(JSONContents, GetType(TestSettings))
'The line about throws an exception of "Cannot convert object of type 'System.String' to type 'System.Byte[]'"
Dim Setting1String2 As String = Encoding.ASCII.GetString(Items.Setting1)
Dim Setting2String2 As String = Encoding.ASCII.GetString(Items.Setting2)
...any help with how to serialize and deserialize and get the same output as Newtonsoft.JSON would be most appreciated.
Upvotes: 2
Views: 2561
Reputation: 46977
Use the json serializer in System.Text.Json
instead with serialization option
IncludeFields
set to true
Sub Main
Dim SettingsObj As TestSettings = New TestSettings
SettingsObj.Setting1 = Encoding.ASCII.GetBytes("This is setting 1")
SettingsObj.Setting2 = Encoding.ASCII.GetBytes("This is setting 2")
Dim options As New JsonSerializerOptions() With { .IncludeFields = True }
Dim JSONString = System.Text.Json.JsonSerializer.Serialize(SettingsObj, options)
Dim obj = System.Text.Json.JsonSerializer.Deserialize(Of TestSettings)(JSONString, options)
End Sub
Public Class TestSettings
Public Setting1 As Byte()
Public Setting2 As Byte()
End Class
Upvotes: 2