在vb.net中解析Json
问题描述:
我有以下Json,我希望在vb.net中循环并提取问题和结果。我试图使用Newtonsoft.json,但是虽然JSONlint验证了Json,但我收到了错误。什么是实现这个的正确方法?在vb.net中解析Json
{
"Vehicle_Check": [
19,
{
"question": "Brakes",
"result": "OK",
"Fault": ""
},
{
"question": "Water Levels",
"result": "OK",
"Fault": ""
},
{
"question": "Horn",
"result": "OK",
"Fault": ""
},
{
"question": "Washers",
"result": "OK",
"Fault": ""
},
{
"question": "Wipers",
"result": "OK",
"Fault": ""
},
{
"question": "Indicators",
"result": "OK",
"Fault": ""
},
{
"question": "Reflectors",
"result": "OK",
"Fault": ""
},
{
"question": "Oil Levels",
"result": "OK",
"Fault": ""
},
{
"question": "Lights",
"result": "OK",
"Fault": ""
},
{
"question": "Mirrors",
"result": "OK",
"Fault": ""
},
{
"question": "Steering",
"result": "OK",
"Fault": ""
},
{
"question": "Tyres Wheels",
"result": "OK",
"Fault": ""
},
{
"question": "Battery",
"result": "OK",
"Fault": ""
},
{
"question": "Fuel or Oil Leaks",
"result": "OK",
"Fault": ""
},
{
"question": "Other",
"result": "OK",
"Fault": ""
}
]
}
我使用解析JSON的代码是:
Dim o As JObject = JObject.Parse(VCItem.Check)
Dim results As List(Of JToken) = o.Children().ToList
For Each item As JProperty In results
item.CreateReader()
Select Case item.Name
'process data here
End Select
Next
这仅返回的最后一个元素:
{[
19,
{
"question": "Other",
"result": "OK",
"Fault": ""
}
]}
答
实际上它返回的第一个和最后一个元素。给定你发布的内容,19是数组中的第一项,反正这是不合适的。
试试这个(是的,它看起来很可怕,我知道)但是我不得不从列表中删除19,因为它不是一个对象而是一个字符串。你的数组有不同的类型,你需要测试字符串是否必须保留。我正致力于更好地阅读JSON,但这需要比我希望的更长的时间。
Dim o As JObject = JObject.Parse(VCItem)
Dim results As List(Of JToken) = o.Children().ToList
For Each item As JProperty In results
item.CreateReader()
If item.Value.Type = JTokenType.Array Then
Dim results2 As List(Of JToken) = item.Value.ToList
For Each subitem As JObject In results2
Dim results3 As List(Of JToken) = subitem.Children().ToList
For Each temp2 As JProperty In results3
temp2.CreateReader()
MsgBox(temp2.Name)
MsgBox(temp2.Value)
Next
Next
End If
Next
发现,以显示你的价值观更简单的方法,但仍取决于JSON字符串的结构(发现简单的方法在这里:How to Parse Json children in VB.NET Newtonsoft)
Dim o As JObject = JObject.Parse(VCItem)
Dim results As List(Of JToken) = o.Children().ToList
For Each item As JProperty In results
item.CreateReader()
If item.Value.Type = JTokenType.Array Then
For Each subitem As JObject In item.Values
MsgBox(subitem("question"))
MsgBox(subitem("result"))
MsgBox(subitem("Fault"))
Next
End If
Next
你得到了什么错误? –
我们可以看到您试图用来进行反序列化的代码吗? –
@ user1898898你应该编辑你的问题并把代码放在那里,而不是在评论中。 – crashmstr