我必须序列化和反序列化另一个程序使用的JSON字符串.

我对JSON知之甚少,所以请对我温柔点.

另一个程序使用NewtonSoft.JSON来做这件事,但这是我唯一需要NewtonSoft.JSON做的事情,所以我宁愿不使用NewtonSoft.JSON来做这件事,所以我的程序中不必包括DLL.

另一个程序的序列化如下所示:

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=""}

并像这样反序列化:

 '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"

我已经try 了以下序列化:

       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]}

...如您所见,返回的字符串不同,对于反序列化,我try 了:

       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)

...如果能帮助我们进行序列化和反序列化,并获得与Newtonsoft.JSON相同的输出,我们将不胜感激.

推荐答案

使用带有序列化选项的System.Text.Json中的JSON序列化程序 IncludeFields设置为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

Json相关问答推荐

使用SQL查询从SON中查找第n个密钥对值

如何在使用GO时检测JSON中不需要的字段?

抓取低于w jolt的对象级别

如何使用JQ打印每个根级对象键一行?

合并2个嵌套词典

json 字符串到 Postgres 14 中的表视图

如何使用jolt将嵌套数据变成线性数据

Powershell - 如何从 JSON 中删除/过滤元素但保留其余部分?

流导入错误:重新上传时不存在布局释放 UUID

如果有 1 个元素,如何防止 ConvertFrom-Json 折叠嵌套数组

使用 JQ 从文件中删除重复的 JSON 块

如何使用 C# 将 JSON 文本转换为对象

Spring MVC控制器中的JSON参数

没有默认构造函数的杰克逊第 3 方类

关于使用 $ref 的 JSON 模式

ASP.NET Core API 仅返回列表的第一个结果

IE10/11 Ajax XHR 错误 - SCRIPT7002:XMLHttpRequest:网络错误 0x2ef3

如何使用 Javascript 将数据写入 JSON 文件

JSON - 是否有任何 XML CDATA 类似功能?

play 2 JSON 格式中缺少的属性的默认值