You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:15:58