You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON转DataTable报错:无法将"?"转换为System.Boolean原因咨询

问题分析与解决思路

为什么会被识别为布尔类型?

当你用VB.NET的JSON转DataTable函数(比如Newtonsoft.Json的JsonConvert.DeserializeObject(Of DataTable)(jsonString))时,序列化器会根据JSON数组的第一行数据推断DataTable的列类型。举个例子:如果你的JSON第一行的OLD_VALUE字段是布尔值(true或false),序列化器就会把整个OLD_VALUE列的类型设为Boolean。后面行的OLD_VALUE如果是字符串"?",就会因类型不匹配抛出转换异常。

解决方法

1. 手动指定DataTable列类型

先创建好DataTable,明确每个列的类型(比如把OLD_VALUE设为String),再填充JSON数据:

Dim dt As New DataTable()
dt.Columns.Add("OLD_VALUE", GetType(String))
' 添加上其他需要的列...

Dim jsonReader As New JsonTextReader(New StringReader(jsonString))
Dim serializer As New JsonSerializer()
dt = serializer.Deserialize(Of DataTable)(jsonReader)

2. 配置序列化器禁用自动类型推断

通过JsonSerializerSettings强制序列化器将不确定的列视为字符串,或自定义转换器处理类型冲突:

Dim settings As New JsonSerializerSettings()
settings.Converters.Add(New CustomBooleanConverter())

Dim dt As DataTable = JsonConvert.DeserializeObject(Of DataTable)(jsonString, settings)

' 自定义转换器示例
Public Class CustomBooleanConverter
    Inherits JsonConverter(Of Object)
    Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, hasExistingValue As Boolean, serializer As JsonSerializer) As Object
        If reader.Value IsNot Nothing AndAlso reader.Value.ToString() = "?" Then
            Return "?"
        End If
        Return Convert.ToBoolean(reader.Value)
    End Function

    Public Overrides Sub WriteJson(writer As JsonWriter, value As Object, serializer As JsonSerializer)
        writer.WriteValue(value.ToString())
    End Sub
End Class

3. 修改JSON结构(若可行)

统一OLD_VALUE字段的类型:要么全用布尔值,要么全转成字符串(比如把true/false改成"true"/"false",和"?"保持一致)。

内容的提问来源于stack exchange,提问作者8oris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:43:10