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
相关产品推荐
相关产品推荐

