VB.NET中JSON数组反序列化报错,求解决方法
解决VB.NET中Newtonsoft.Json解析JSON数组报错的问题
你的错误根源很明确:你试图用解析单个JSON对象的方法去解析JSON数组。你的JSON是用[]包裹的对象数组,但你用了JObject.Parse()——这个方法只适用于解析{}包裹的单个JSON对象,所以当解析器读完第一个对象后遇到逗号,就会抛出"Additional text encountered..."的错误。
快速修正方案:改用JArray.Parse()
把解析代码从JObject.Parse换成JArray.Parse,然后直接遍历数组中的每个对象即可。修正后的代码如下:
Imports Newtonsoft.Json Imports Newtonsoft.Json.Linq ... Dim json As String = getCrimeData(area) ' 用JArray.Parse解析数组类型的JSON Dim crimeArray As JArray = JArray.Parse(json) Dim output As String = "" ' 遍历数组中的每个JSON对象 For Each crimeObj As JObject In crimeArray ' 直接通过属性名访问值,包括嵌套属性 Dim category = crimeObj("category").ToString() Dim month = crimeObj("month").ToString() Dim streetName = crimeObj("location")("street")("name").ToString() ' 你的Select Case逻辑可以在这里实现 Select Case category Case "anti-social-behaviour" output &= $"反社会行为事件:{streetName},发生月份:{month}{Environment.NewLine}" ' 其他分类的处理逻辑 End Select Next
更优雅的方式:强类型反序列化
如果你的JSON结构固定,建议定义对应的实体类,然后直接反序列化为List(Of 实体类),这样代码更类型安全,可读性也更好:
首先定义实体类:
Public Class Crime Public Property category As String Public Property location_type As String Public Property location As Location Public Property context As String Public Property outcome_status As Object ' 如果outcome_status有固定结构,也可以定义对应的类 Public Property persistent_id As String Public Property id As Integer Public Property location_subtype As String Public Property month As String End Class Public Class Location Public Property latitude As String Public Property street As Street Public Property longitude As String End Class Public Class Street Public Property id As Integer Public Property name As String End Class
然后反序列化代码会非常简洁:
Dim crimeList As List(Of Crime) = JsonConvert.DeserializeObject(Of List(Of Crime))(json) For Each crime In crimeList Select Case crime.category Case "anti-social-behaviour" ' 直接访问强类型属性,无需ToString()转换(按需处理) Console.WriteLine($"事件:{crime.category},地点:{crime.location.street.name}") End Select Next
额外说明
- 原来代码中的
item.CreateReader()是多余的,直接通过JObject的索引器就能访问所有属性。 - 如果JSON数组中可能存在null值或者可选属性,记得加上空值判断,避免空引用异常。
内容的提问来源于stack exchange,提问作者FraserOfSmeg
相关产品推荐
相关产品推荐

