System.Text.Json 支持DataTable和DataSet

文章介绍了如何在.NETCore中使用Microsoft的System.Text.Json库处理DataTable和DataSet转换为JSON字符串,包括提供自定义JsonConverter实现以及设置JsonSerializerOptions。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于字符串转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 为转化参数设置,在这里设置转化类就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值