如何解析vb.net中的json键和子键



我的基本vb.net代码如下:

Dim request As HttpWebRequest
Dim response As HttpWebResponse = Nothing
Dim reader As StreamReader
request = DirectCast(WebRequest.Create("https://openiban.com/v2/calculate/DE/10011001/2624579856"), HttpWebRequest)
response = DirectCast(request.GetResponse(), HttpWebResponse)
reader = New StreamReader(response.GetResponseStream())
Dim rawresp As String
rawresp = reader.ReadToEnd()
Dim jsonResulttodict = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(rawresp)
Dim ibanX = jsonResulttodict.Item("iban")
Dim bicX = jsonResulttodict.Item("bic")
txt1.Text = ibanX
txt2.text = bicX

, JSON是:

{
"valid": true,
"messages": [
"Bank code valid: 10011001"
],
"iban": "DE42100110012624579856",
"bankData": {
"bankCode": "10011001",
"name": "N26 Bank",
"zip": "10179",
"city": "Berlin",
"bic": "NTSBDEB1XXX"
},
"checkResults": {
"bankCode": true
}
}

所以我收到这个错误的BIC:System.Collections.Generic。KeyNotFoundException: '给定的键不存在于字典中。'

问题:

如何解析子键"bic">

谢谢

尝试放置Dim bicX = jsonResulttodict.Item("bankData.bic")

bic元素不是字典的键,它是bankData对象的属性,所以你当然会得到那个异常。

您可以使用JsonObject.Parse()解析JSON,然后使用其索引功能提取嵌套值:
(包括对原始代码的一些重构;HttpWebResponseStreamReader需要处理)

Dim request = WebRequest.CreateHttp("https://openiban.com/v2/calculate/DE/10011001/2624579856")
Using response = DirectCast(request.GetResponse(), HttpWebResponse),
reader = New StreamReader(response.GetResponseStream())
Dim json = reader.ReadToEnd()
Dim bankInfo As JObject = JObject.Parse(json)
Dim iban = bankInfo("iban").ToString()
Dim bic = bankInfo("bankData")("bic").ToString()
End Using

如果你使用。net而不是。net框架,我建议用System.Text.Json来反序列化(因为它已经存在了,虽然它也可以在。net框架中使用,添加NuGet包)。
另外,最好转到HttpClient。
如果您的GUI平台是WinForms(您有txt1.Text),将async添加到运行此代码的事件处理程序(或任何其他方法)。例如:

Imports System.Net.Http
Imports System.Text.Json
Private Shared ReadOnly client As New HttpClient()
' [...]
Private Async Sub SomeButton_Click(sender As Object, e As EventArgs) Handles SomeButton.Click
Dim json = Await client.GetStringAsync("https://openiban.com/v2/calculate/DE/10011001/2624579856")
Dim bankInfo = JsonDocument.Parse(json)
Dim iban = bankInfo.RootElement.GetProperty("iban").ToString()
Dim bic = bankInfo.RootElement.GetProperty("bankData").GetProperty("bic").ToString()
End Sub

最新更新