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
英文地址,請注明出處:http://en.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 # …