C#,VB.NET从JSON数据里提取数组中的对象节点值

VB.NET中,若要从 JSON 数据里提取Data.DataList数组中的CategoryId,并将其转换为VB.NET数组,可借助Json.NET(Newtonsoft.Json)库来实现。下面为你详细介绍具体的实现步骤和代码示例:

一、实现 JSON 到数组的转换

方法 1:通过 JObject 解析(灵活通用)
vbnet 复制代码
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Public Function ExtractCategoryIds(jsonText As String) As Long()
    Try
        ' 解析JSON根对象
        Dim jsonObj As JObject = JObject.Parse(jsonText)
        
        ' 获取DataList数组
        Dim dataList As JArray = jsonObj?("Data")?("DataList") as JArray
        If dataList Is Nothing Then
            Return New Long(-1) {}  ' 返回空数组
        End If
        
        ' 提取CategoryId并转换为数组
        Return dataList
            .Select(Function(item) item?("CategoryId")?.Value(Of Long)())
            .Where(Function(id) id.HasValue)
            .Select(Function(id) id.Value)
            .ToArray()
    Catch ex As Exception
        Console.WriteLine("JSON解析错误: " & ex.Message)
        Return New Long(-1) {}  ' 出错时返回空数组
    End Try
End Function

方法 2:反序列化为强类型对象(类型安全)

vbnet 复制代码
Imports Newtonsoft.Json

' 定义数据模型
Public Class RootObject
    Public Property Code As Integer
    Public Property Data As DataObject
End Class

Public Class DataObject
    Public Property TotalCount As Integer
    Public Property PageIndex As Integer
    Public Property PageSize As Integer
    Public Property DataList As List(Of CategoryItem)
End Class

Public Class CategoryItem
    Public Property CategoryId As Long
End Class

' 转换方法
Public Function ExtractCategoryIdsWithModel(jsonText As String) As Long()
    Try
        ' 反序列化为强类型对象
        Dim root As RootObject = JsonConvert.DeserializeObject(Of RootObject)(jsonText)
        
        ' 提取CategoryId数组
        If root?.Data?.DataList Is Nothing Then
            Return New Long(-1) {}
        End If
        
        Return root.Data.DataList
            .Select(Function(item) item.CategoryId)
            .ToArray()
    Catch ex As Exception
        Console.WriteLine("JSON反序列化错误: " & ex.Message)
        Return New Long(-1) {}
    End Try
End Function

二、使用示例

vbnet 复制代码
Sub Main()
    Dim jsonText As String = "{""Code"":200,""Data"":{""TotalCount"":14,""PageIndex"":1,""PageSize"":100,""DataList"":[{""CategoryId"":271},{""CategoryId"":272}]}}"
    
    ' 方法1:动态解析
    Dim categoryIds1 As Long() = ExtractCategoryIds(jsonText)
    
    ' 方法2:强类型解析
    Dim categoryIds2 As Long() = ExtractCategoryIdsWithModel(jsonText)
    
    ' 输出结果
    Console.WriteLine("提取的CategoryId数组:")
    For Each id In categoryIds1
        Console.WriteLine(id)  ' 输出: 271, 272
    Next
End Sub

三、关键要点说明

  1. 空值处理

    • 运用?.操作符来避免出现NullReferenceException
    • 对可能为空的数组进行检查,防止程序崩溃。
  2. 类型转换

    • 采用Value(Of Long)()方法将 JSON 值转换为 Long 类型。
    • 借助Where(Function(id) id.HasValue)过滤掉无效的值。
  3. 异常处理

    • 捕获JsonReaderExceptionJsonSerializationException,增强程序的健壮性。
    • 出错时返回空数组,而非Nothing,减少上层代码的判断逻辑。

四、扩展功能

1. 处理嵌套路径(通用方法)

vb

vbnet 复制代码
Public Function ExtractValuesByPath(jsonText As String, path As String) As Long()
    Try
        Dim jsonToken As JToken = JToken.Parse(jsonText)
        Dim tokens As IEnumerable(Of JToken) = jsonToken.SelectTokens(path)
        
        Return tokens
            .Select(Function(token) token.Value(Of Long)())
            .ToArray()
    Catch ex As Exception
        Console.WriteLine($"提取路径 {path} 出错: {ex.Message}")
        Return New Long(-1) {}
    End Try
End Function

' 使用示例
Dim categoryIds As Long() = ExtractValuesByPath(jsonText, "$.Data.DataList[*].CategoryId")
2. 异步解析大 JSON 文件
vbnet 复制代码
Public Async Function ExtractCategoryIdsAsync(jsonText As String) As Task(Of Long())
    Try
        Using reader As New StringReader(jsonText)
            Using jsonReader As New JsonTextReader(reader)
                Dim serializer As JsonSerializer = New JsonSerializer()
                Dim root As RootObject = Await Task.Run(Function() 
                    serializer.Deserialize(Of RootObject)(jsonReader)
                End Function)
                
                Return root?.Data?.DataList?
                    .Select(Function(item) item.CategoryId)
                    .ToArray() ?? New Long(-1) {}
            End Using
        End Using
    Catch ex As Exception
        Console.WriteLine("异步解析错误: " & ex.Message)
        Return New Long(-1) {}
    End Try
End Function

五、性能考量

  • 小 JSON:推荐使用强类型反序列化(方法 2),这样能提高代码的可读性和类型安全性。
  • 大 JSON :建议采用JsonTextReader进行流式解析,以降低内存的占用。
  • 动态路径 :可使用SelectTokens方法来处理复杂的 JSON 结构。

通过上述方法,你可以在VB.NET中高效、安全地从 JSON 数据里提取所需的数组。

在不使用第三方库的情况下,如何实现JSON到数组的转换?

提供一些关于JSON和数组操作的VB.NET最佳实践。

除了Json.NET库,还有哪些常用的JSON库可用于VB.NET

相关推荐
宝桥南山1 小时前
Microsoft Agent Framework(.NET) - 尝试一下从MCP Server上获取Agent Skills
ai·微软·c#·aigc·.net·.netcore
少控科技3 小时前
农场设备管理代码(1)
开发语言·c#
灵析表格5 小时前
json_ObjectToKV 函数:Excel解析JSON对象的权威方案
json·excel
灵析表格6 小时前
灵析表格文本处理函数技术白皮书:WPS Excel 官方函数扩展库 18 项文本规整与正则批处理企业落地标准
ai·json·excel·wps
海盗12346 小时前
微软技术日报·2026-08-12——Windows 11多通道累积更新推送十余项功能改进;.NET WebSocket DoS紧急修复
windows·microsoft·.net
椒颜皮皮虾྅17 小时前
OpenVINO C# API 3.3.1:支持OpenVINO 2026.3及GenAI增强
人工智能·c#·openvino
半亩码田20 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#
桑榆4161 天前
JSON 格式
json
唐青枫1 天前
别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解
c#·.net
LccKyI1 天前
C#学习day06(方法/函数及其关键字,附思维导图)
经验分享·学习·c#