2013-10-28 107 views
0

我有以下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": "" 
    } 
]} 
+2

你得到了什麼錯誤? –

+0

我們可以看到您試圖用來進行反序列化的代碼嗎? –

+0

@ user1898898你應該編輯你的問題並把代碼放在那裏,而不是在評論中。 – crashmstr

回答

0

實際上它返回的第一個和最後一個元素。給定你發佈的內容,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