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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:57