VB.NET如何解析JSON键与子键?解决BIC子键获取异常
解决VB.NET解析JSON子键"bic"的问题
问题原因
你遇到的KeyNotFoundException是因为"bic"并非JSON的顶级键,它嵌套在bankData对象内部,不能直接通过jsonResulttodict.Item("bic")获取,也不支持"bankData.bic"这种直接的点语法访问嵌套键。
解决方法1:嵌套访问Dictionary
既然你用Dictionary(Of String, Object)来反序列化,需要先获取bankData对应的子字典,再从中提取"bic"值:
修改后的核心代码:
Dim jsonResulttodict = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(rawresp) Dim ibanX = jsonResulttodict.Item("iban") ' 先获取bankData对应的子字典 Dim bankDataDict = DirectCast(jsonResulttodict.Item("bankData"), Dictionary(Of String, Object)) ' 从子字典中获取bic Dim bicX = bankDataDict.Item("bic") txt1.Text = ibanX txt2.Text = bicX
解决方法2:使用强类型实体类反序列化(推荐)
对于结构化的JSON,创建对应的实体类进行反序列化会更安全、易维护,避免键名拼写错误和类型转换问题:
- 定义匹配JSON结构的实体类:
Public Class OpenIbanResponse Public Property Valid As Boolean Public Property Messages As List(Of String) Public Property Iban As String Public Property BankData As BankData Public Property CheckResults As CheckResults End Class Public Class BankData Public Property BankCode As String Public Property Name As String Public Property Zip As String Public Property City As String Public Property Bic As String End Class Public Class CheckResults Public Property BankCode As Boolean End Class
- 修改反序列化代码:
Dim rawresp As String = reader.ReadToEnd() Dim response = JsonConvert.DeserializeObject(Of OpenIbanResponse)(rawresp) txt1.Text = response.Iban txt2.Text = response.BankData.Bic
原问题中的代码与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 } }
内容的提问来源于stack exchange,提问作者Mohammed Abdelkrim Mekdour
相关产品推荐
相关产品推荐

