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

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

一、实现 JSON 到数组的转换

方法 1:通过 JObject 解析(灵活通用)
Imports Newtonsoft.Json
Imports Newtonsoft.Json.LinqPublic 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 JArrayIf dataList Is Nothing ThenReturn 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 ExceptionConsole.WriteLine("JSON解析错误: " & ex.Message)Return New Long(-1) {}  ' 出错时返回空数组End Try
End Function

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

Imports Newtonsoft.Json' 定义数据模型
Public Class RootObjectPublic Property Code As IntegerPublic Property Data As DataObject
End ClassPublic Class DataObjectPublic Property TotalCount As IntegerPublic Property PageIndex As IntegerPublic Property PageSize As IntegerPublic Property DataList As List(Of CategoryItem)
End ClassPublic Class CategoryItemPublic 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 ThenReturn New Long(-1) {}End IfReturn root.Data.DataList.Select(Function(item) item.CategoryId).ToArray()Catch ex As ExceptionConsole.WriteLine("JSON反序列化错误: " & ex.Message)Return New Long(-1) {}End Try
End Function

二、使用示例

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 categoryIds1Console.WriteLine(id)  ' 输出: 271, 272Next
End Sub

三、关键要点说明

  1. 空值处理

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

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

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

四、扩展功能

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

vb

Public Function ExtractValuesByPath(jsonText As String, path As String) As Long()TryDim 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 ExceptionConsole.WriteLine($"提取路径 {path} 出错: {ex.Message}")Return New Long(-1) {}End Try
End Function' 使用示例
Dim categoryIds As Long() = ExtractValuesByPath(jsonText, "$.Data.DataList[*].CategoryId")
2. 异步解析大 JSON 文件
Public Async Function ExtractCategoryIdsAsync(jsonText As String) As Task(Of Long())TryUsing 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 UsingEnd UsingCatch ex As ExceptionConsole.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?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912986.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 进阶:实现带圆角的 CircularProgressIndicator

在 Flutter 中,我们经常使用 CircularProgressIndicator 来展示加载进度。但是你是否注意到:它的进度端始终是“平头”的(直角)? 这在一些 UI 设计中并不美观,特别是想实现类似 Apple 健身环那样“前端圆清…

解决CentOS7下载docker-compose出现没有可用软件包问题

1 问题描述 今天在使用虚拟机CentOS 7系统安装docker-compose时,用的是aliyun镜像,出现没有可用软件包的问题,这就说明不是因为网络,而是因为aliyun镜像没有该软件包。 2 解决办法 这里推荐最稳定的解决办法,去docker-…

基于SpringBoot+Vue的酒类仓储管理系统

文档包含用例图、系统架构图、系统功能结构图、实体属性图、总体e-r图。一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架项目架构:B/S架构运行环境:win10/win11、jdk17前端:技术:框架Vue.js&a…

月付物理服务器租用平台-青蛙云

青蛙云物理服务器租用服务概述 青蛙云是一家提供物理服务器租用服务的平台,支持月付、年付等灵活付费方式,物理服务器适合企业或个人用户的高性能计算需求。其服务覆盖多地区机房,提供多种配置选项,支持定制化需求。 核心优势 …

基于二分类方法和安全系数方法使用comsol with matlab蒙特卡洛模拟实现边坡失效概率计算——随机变量模型

基于二分类方法和安全系数方法使用comsol with matlab蒙特卡洛模拟实现边坡失效概率计算——随机变量模型 模型和全部代码下载随机变量模拟加载comsol模型蒙特卡洛模拟(分类模型)蒙特卡洛模拟(安全系数模型)内聚力和内摩擦角随机变量分布二分类稳定性1000次运行结果失效概率…

机器学习-02(深度学习的基本概念)

机器学习的步骤 1.定义带有未知参数的函数 线性模型(linear models)具有较大的限制(Model Bias) y b wx 无论如何更改b或者w,其只会呈现出一条直线,不能满足更加复杂的现实情况。 我们可以将复杂的函…

InspireFace C++ 架构分析

InspireFace C 架构分析 https://github.com/deepinsight/insightface/tree/master/cpp-package/inspireface 1. 项目概述 InspireFace 是一个高性能的人脸识别和分析 SDK,采用 C 开发,提供了完整的人脸检测、跟踪、特征提取、活体检测、属性分析等功…

【网络安全】Webshell命令执行失败解决思路

前言费尽心思上传了webshell,上传下载都没问题,却发现命令执行总是失败?最近也打点也遇到了这些问题,网上有部分文章,但都是零碎知识点并且实战不一定能用,今天就结合我个人经验剖析webshell上线后cmd命令执…

【机器人】复现 HOV-SG 机器人导航 | 分层 开放词汇 | 3D 场景图

HOV-SG 是通过语言指令实现机器人导航的,核心特点是分层结构、开放词汇、3D场景图。 来自RSS 2024,大规模、多层次的环境构建精确的、开放词汇的3 场景图,并使机器人能够通过语言指令在其中有效地导航。 论文地址:Hierarchical …

jvm 锁升级机制

Java 虚拟机(JVM)中的锁升级机制(也称为锁膨胀)是 HotSpot 虚拟机为了优化 synchronized 关键字的性能而引入的一项重要技术。它的核心思想是:根据实际遇到的竞争激烈程度,动态地将锁从开销最小的状态逐步升…

金蝶云星空 (9.0版本) ERP的WebApi接口随机出现SSLException

环境: java-1.8.0-openjdk-1.8.0.131 hutool-all 依赖, 5.8.25版本 项目背景: 发版上线,用的hutool工具类 HttpUtil.createPost() ,请求域名为https://xxx.ik3cloud.com/k3cloud 的金蝶ERP webapi接口 问题&#xff1…

用java,把12.25.pdf从最后一个点分割,得到pdf

要在Java中从文件名 12.25.pdf 的最后一个点(.)分割文件名和扩展名,可以使用 String 类的 lastIndexOf() 和 substring() 方法。以下是一个示例代码: public class FileNameSplitter {public static void main(String[] args) {St…

UE5 重新编译插件版本

打开要转换的UE的安装目录,一直找到这个文件 不要双击,在地址栏里输入cmd打开命令行,输入如下指令 RunUAT.bat BuildPlugin -plugin"E:\OldPlugin\chatbot5.3\chatbot\chatbot.uplugin" -package"E:\NewPlugin"-plugin…

Linux下的调试器-gdb(16)

文章目录 预备知识(9-2.30.00)快速认识 gdbgdb 的命令1. 更换成 cgdb2. 打和去除断点3. 逐语句与逐过程4. 使能(激活)断点 调试思想1. 找到问题(找到问题所在的区域)2. 查看代码的上下文 补充调试技巧1. wa…

李宏毅NLP-7-计算分数和训练和测试

文章目录 分数计算训练测试 分数计算 插入式序列生成模型的概率计算逻辑,核心是将 “生成序列 h 的过程” 拆解为一系列插入操作,并通过步骤概率的乘积计算总概率 P ( h ∣ X ) P(h∣X) P(h∣X)。以下从 模型框架、步骤分解、概率计算 三个层面解析&…

Python字符与ASCII转换方法

在Python中,可以使用内置函数 ord() 和 chr() 来转换字符和ASCII码: ​获取字符的ASCII码​ - 用 ord() ascii_code ord(A) # 返回 65 ​将ASCII码转为字符​ - 用 chr() character chr(65) # 返回 A 示例: # 打印字母A-Z的ASCII码…

[IMX][UBoot] 10.启动流程 (6) - bootz 命令启动 Linux

文章链接 UBoot 启动流程 (1) - 基本流程 UBoot 启动流程 (2) - 平台前期初始化阶段 - board_init_f UBoot 启动流程 (3) - UBoot 程序重定位 - relocate_code UBoot 启动流程 (4) - 平台后期初始化阶段 - board_init_r UBoot 启动流程 (5) - UBoot 运行阶段 - main_loop …

TCP 三次握手协商 MSS 前,如何确定 MSS 值(结合 Linux 内核源码分析)

文章目录 一、SYN总结影响 SYN MSS 的因素 二、SYNACK总结影响 SYNACK MSS 的因素 结合 Linux 内核源码 一、SYN 总结影响 SYN MSS 的因素 套接字选项 TCP_MAXSEG路由选项 advmss出口 MTU 减去 40(TCP 和 IP 的固定首部大小)IPV4_MAX_PMTU - 40(同上) 二、SYNACK 总结影响 SY…

面试150 矩阵置0

思路 我们使用两个标记集合,分别记录当矩阵的元素为0的时候的横、纵坐标。然后在对矩阵元素进行遍历,如果所在行或者所在列的索引在集合中,对应的矩阵元素修改为0即可 class Solution:def setZeroes(self, matrix: List[List[int]]) -> N…

Element UI 完整使用实战示例

以下是 Element UI 的完整使用实战示例,涵盖从环境搭建、基础组件使用到项目实战的全流程,结合多个实际场景和代码示例: 一、环境搭建与基础配置 1. 安装 Element UI 通过 npm 或 yarn 安装: npm install element-ui --save # …