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

VB.NET中JObject转String无效,如何将JsonObject转为可便捷访问的常规对象?

解决VB.NET中JObject转对象的InvalidCastException问题

看起来你踩了一个常见的JSON解析坑——你可能把已经解析好的JObject实例当成JSON字符串来处理了!先帮你拆解下错误原因,再给你两种实用的解决方案:

错误原因分析

你提到远程系统返回的是System.Collections.Generic.List(Of JObject)类型的列表,这意味着当你遍历列表时,拿到的row本身就是已经解析完成的JObject对象,而不是原始的JSON字符串。

这时候你调用JObject.Parse(row)或者JsonConvert.DeserializeObject(Of ...)(row),就会触发InvalidCastException——因为这两个方法的参数需要是JSON格式的字符串,而你传入的是JObject实例,VB.NET无法自动把JObject转换成字符串,所以报错“Conversion from type 'JObject' to type 'String' is not valid”。

解决方案1:直接使用JObject访问属性

既然row已经是JObject,完全不需要再二次解析,直接通过索引器访问嵌套属性即可:

' 假设远程返回的列表是List(Of JObject)类型
For Each row As JObject In remoteResponseList
    ' 直接访问Demo节点下的各个属性
    Dim demoId As String = row("Demo")("_id").ToString()
    Dim status As String = row("Demo")("status").ToString()
    Dim contactNumber As String = row("Demo")("number").ToString()
    Dim createdBy As String = row("Demo")("history")("created_by").ToString()
    Dim createdOn As DateTime = DateTime.Parse(row("Demo")("history")("created_on").ToString())
    
    ' 这里可以把值赋值给变量或者进行业务处理
    Console.WriteLine($"Demo ID: {demoId}, Status: {status}")
Next

解决方案2:转换为强类型对象(更推荐,代码更易维护)

如果希望用更直观的对象属性访问,可以先定义对应JSON结构的类,再通过JObject的ToObject方法直接转换:

第一步:定义匹配JSON结构的类

Public Class History
    Public Property created_on As DateTime
    Public Property created_by As String
    Public Property batch_date As DateTime
End Class

Public Class DemoItem
    Public Property _id As String
    Public Property _type As String
    Public Property status As String
    Public Property batch As Integer
    Public Property action As Object ' 如果action有固定类型,可以替换为String/Integer等
    Public Property number As String
    Public Property cname_text As String
    Public Property history As History
End Class

Public Class RootData
    Public Property Demo As DemoItem
End Class

第二步:遍历并转换为强类型对象

' 假设远程返回的列表是List(Of JObject)类型
For Each row As JObject In remoteResponseList
    ' 直接把JObject转换为自定义的RootData类
    Dim rootData As RootData = row.ToObject(Of RootData)()
    
    ' 现在可以通过属性直接访问,代码可读性更高
    Console.WriteLine($"Demo ID: {rootData.Demo._id}")
    Console.WriteLine($"Created By: {rootData.Demo.history.created_by}")
    Console.WriteLine($"Created On: {rootData.Demo.history.created_on:yyyy-MM-dd HH:mm:ss}")
Next

额外提醒

如果之后遇到类似的JSON解析问题,先确认要处理的对象类型:

  • 如果是原始JSON字符串,用JObject.Parse()或者JsonConvert.DeserializeObject()
  • 如果是已经解析好的JObject/JArray,直接操作或者用ToObject()转换为强类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:37:45