Ozymandius257
Ozymandius257

Reputation: 33

How to serialize / deserialize without using Newtonsoft.JSON

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

Answers (1)

Magnus
Magnus

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

Related Questions