VB中如何循环读取嵌套JSON对象内row节点的字段值
VB 循环读取JSON嵌套行项目字段实现方案
实现逻辑
现有代码已经完成JSON根节点、result数组第一层字段的解析,读取嵌套line_items的核心逻辑如下:
line_items是标准JSON数组结构,解析后对应JArray类型,可直接通过For Each遍历所有行元素- 每个行元素下的
row节点是存储行字段的对象,对应JObject类型,既可以按字段名定向取值,也可以遍历属性动态读取所有字段值
修改后完整代码
Dim clientPI As RestClient = New RestClient("https://sampleurl") Dim requestPI = New RestRequest(Method.POST) requestPI.AddParameter("name", "Aravind") requestPI.AddParameter("username", "aravind") requestPI.AddParameter("password", "aravind123") requestPI.AddParameter("id", "100") Dim responsePI As RestResponse = clientPI.Execute(requestPI) Dim StrReturnPI As String = responsePI.Content.ToString() Dim serPI As JObject = JObject.Parse(StrReturnPI) Dim dataPI As List(Of JToken) = serPI.Children().ToList Dim output As String = "" For Each item As JProperty In dataPI item.CreateReader() Select Case item.Name Case "result" output += "Document_id:" + vbCrLf For Each comment As JObject In item.Values ' 原有第一层字段读取逻辑 Dim u As String = comment("Document_id")?.ToString() output += u + vbTab Dim invDate As JObject = CType(comment("Inv_Date"), JObject) Dim invNumber As JObject = CType(comment("Inv_Number"), JObject) Dim invDateValue As String = invDate("value")?.ToString() output += invDateValue + vbTab Dim invNumberValue As String = invNumber("value")?.ToString() output += invNumberValue + vbCrLf ' 新增:读取line_items嵌套数组 Dim lineItems As JArray = CType(comment("line_items"), JArray) ' 遍历每一行项目 For Each lineItem As JObject In lineItems Dim row As JObject = CType(lineItem("row"), JObject) output += "---行项目 start---" + vbCrLf ' 方式1:按指定字段名读取 Dim sNo As String = row("S No")?.ToString() Dim desc As String = row("Description")?.ToString() Dim qty As String = row("Quantity")?.ToString() Dim unit As String = row("Unit")?.ToString() Dim unitRate As String = row("Unit Rate")?.ToString() Dim lineTotal As String = row("Line_Item_Total")?.ToString() output += $"S No:{sNo}{vbTab}Description:{desc}{vbTab}Quantity:{qty}{vbCrLf}" output += $"Unit:{unit}{vbTab}Unit Rate:{unitRate}{vbTab}Line Total:{lineTotal}{vbCrLf}" ' 方式2(可选):动态遍历row下所有字段,不需要提前写死字段名 'For Each rowProp As JProperty In row.Children(Of JProperty)() ' output += $"{rowProp.Name}:{rowProp.Value.ToString()}{vbTab}" 'Next 'output += vbCrLf ' 可选:读取行级别的其他属性(置信度、页码、坐标) Dim lineConfidence As Double = lineItem("confidence").ToObject(Of Double)() Dim linePage As Integer = lineItem("page_index").ToObject(Of Integer)() output += $"行置信度:{lineConfidence}{vbTab}所在页码:{linePage}{vbCrLf}" output += "---行项目 end---" + vbCrLf + vbCrLf Next Next End Select Next
注意事项
- 代码基于现有使用的
Newtonsoft.Json(Json.NET)编写,和原有解析逻辑完全兼容,取值时加了空值判断,避免字段不存在时抛出空引用异常 - 如果需要读取
row下所有字段(包括示例里的CGST、折扣等字段),直接放开方式2的注释即可,不需要手动逐个写字段名 - 如果需要做结构化存储,可以把每行读取到的字段值存入DataTable或者自定义实体类,方便后续业务处理
内容的提问来源于stack exchange,提问作者Aravind Aravind
相关产品推荐
相关产品推荐

