在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
三、關鍵要點說明
-
空值處理:
- 運用
?.
操作符來避免出現NullReferenceException
。 - 對可能為空的數組進行檢查,防止程序崩潰。
- 運用
-
類型轉換:
- 采用
Value(Of Long)()
方法將 JSON 值轉換為 Long 類型。 - 借助
Where(Function(id) id.HasValue)
過濾掉無效的值。
- 采用
-
異常處理:
- 捕獲
JsonReaderException
和JsonSerializationException
,增強程序的健壯性。 - 出錯時返回空數組,而非
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?