由于字符串转json对象,可能会生产不安全原因,所以微软System.Text.Json在Net Core上面,就默认不支持DataTable和DataSet转换了,但我们一般常用的是让表或数据集对象转换字符串输出给前段,所以怎么办呢,经微软官方示例:
我也只写了将对象转为序列化,如果大家需要反转,大家自已可以参照例子进行改进
DataTable 转为换化字符串
Public Class DataTableJsonConverter
Inherits JsonConverter(Of Data.DataTable)
<Obsolete("This procedure has been obsoleted", True)>
Public Overrides Function Read(ByRef reader As Utf8JsonReader, typeToConvert As Type, options As JsonSerializerOptions) As Data.DataTable
' Dim jsonDoc = JsonDocument.ParseValue(reader)
' Dim rootElement As JsonElement = jsonDoc.RootElement
' Dim dataTable As Data.DataTable = rootElement.JsonElementToDataTable()
Return New Data.DataTable
End Function
Public Overrides Sub Write(JWriter As Utf8JsonWriter, value As Data.DataTable, options As JsonSerializerOptions)
JWriter.WriteStartArray()
For Each R As Data.DataRow In value.Rows
JWriter.WriteStartObject()
For Each col As Data.DataColumn In value.Columns
Dim k As String = col.ColumnName.Trim(), v As Object = R(k)
If "Boolean".Contains(col.DataType.Name) Then
JWriter.WriteBoolean(k, v)
ElseIf "Byte|Decimal|Double|Single|Int16|Int32|Int64".Contains(col.DataType.Name) Then
JWriter.WriteNumber(k, v)
ElseIf "DateTime".Contains(col.DataType.Name) Then
JWriter.WriteString(k, v)
Else
JWriter.WriteString(k, v.ToString)
End If
Next
JWriter.WriteEndObject()
Next
JWriter.WriteEndArray()
End Sub
End Class
DataSetl转化为字符串
Public Class DataSetJsonConverter
Inherits JsonConverter(Of Data.DataSet)
<Obsolete("This procedure has been obsoleted", True)>
Public Overrides Function Read(ByRef reader As Utf8JsonReader, typeToConvert As Type, options As JsonSerializerOptions) As Data.DataSet
' Dim jsonDoc = JsonDocument.ParseValue(reader)
' Dim rootElement As JsonElement = jsonDoc.RootElement
' Dim dataTable As Data.DataTable = rootElement.JsonElementToDataTable()
Return New Data.DataSet
End Function
Public Overrides Sub Write(JWriter As Utf8JsonWriter, value As Data.DataSet, options As JsonSerializerOptions)
JWriter.WriteStartObject()
For Each t As Data.DataTable In value.Tables
JWriter.WriteStartArray(t.TableName)
For Each R As Data.DataRow In t.Rows
JWriter.WriteStartObject()
For Each col As Data.DataColumn In t.Columns
Dim k As String = col.ColumnName.Trim(), v As Object = R(k)
If "Boolean".Contains(col.DataType.Name) Then
JWriter.WriteBoolean(k, v)
ElseIf "Byte|Decimal|Double|Single|Int16|Int32|Int64".Contains(col.DataType.Name) Then
JWriter.WriteNumber(k, v)
ElseIf "DateTime".Contains(col.DataType.Name) Then
JWriter.WriteString(k, v)
Else
JWriter.WriteString(k, v.ToString)
End If
Next
JWriter.WriteEndObject()
Next
JWriter.WriteEndArray()
Next
JWriter.WriteEndObject()
End Sub
End Class
调用的时候需要添加转换类型处理
Function JsonOpts() As JsonSerializerOptions
Dim Opt As New JsonSerializerOptions() With {.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping}
Opt.Converters.Add(New DataTableJsonConverter)
Opt.Converters.Add(New DataSetJsonConverter)
Return Opt
End Function
Function JsonDeserializ(str As String) As Object '文本转Json
Return JsonSerializer.Deserialize(Of Object)(str)
End Function
Function JsonSerializ(obj As Object) As String 'Json转文本
Return JsonSerializer.Serialize(JsonOpts)
End Function
JsonOpts 为转化参数设置,在这里设置转化类就可以了