2013-04-12 72 views
4

我有touble使用VB.NET使用Newtonsoft Json.Net庫如何解析JSON兒童VB.NET Newtonsoft

Json Data 
    --------- 
    { 
     "CC": "[email protected]", 
     "CcFull": [ 
      { 
       "Email": "[email protected]", 
       "Name": "John Sample" 
      }, 
      { 
       "Email": "[email protected]", 
       "Name": "Mike Sample" 
      } 
     ], 
     "FromFull" : { 
      "Email": "[email protected]", 
      "Name": "John Doe" 
     } 
    } 
解析JSON

我能得到這樣一個有效的JObject:

Dim o As JObject = JObject.Parse(strJson) 

然後我可以得到一個JTokens列表並遍歷它們並輕鬆獲取根項目值 - 但是如何讓Child爲CcFull記錄?

Dim results As List(Of JToken) = o.Children().ToList 
    For Each item As JProperty In results 
     item.CreateReader() 
     Select Case item.Name 
      Case "CC" 
       dim strCC = item.Value.ToString 
      Case "CcFull" 
       'This has children (Email and Name) 

     End Select 
    Next 

看來我可能會使用JArray或解析item.value - 但語法避開了我。

我不想在VB中設置一個完整的強類型模型,並執行一個自動反序列化 - 更喜歡在C#中使用動態方法 - 或者最好只是爲nCcull節點迭代n個子項並拔出電子郵件和名稱的值,並將其放入通用列表中。

似乎在SO或Google上沒有好的VB.NET示例。

C#有完全簡單的方法來做到這一點 - 但我被困在這個項目的VB.NET中。

感謝鄉親

回答

4

我在JSON.Net的LINQ到JSON執行方面的專家,但是這個工作對我來說。

你幾乎都在那裏。您需要做的只是在對象模型中進一步鑽取。

Dim results As List(Of JToken) = o.Children().ToList 
For Each item As JProperty In results 
    item.CreateReader() 
    Select Case item.Name 
     Case "CC" 
      Dim strCC = item.Value.ToString 
     Case "CcFull" 
      Dim strEmail As String 
      Dim strName As String 

      For Each subitem As JObject In item.Values 
       strEmail = subitem("Email") 
       strName = subitem("Name") 
      Next 
    End Select 
Next 

您從結果列表中獲得的項目具有子項,如您所述。該子項具有一系列值 - 數組由JSON字符串中的括號表示。 Values方法是一個IEnumerable方法,所以我們可以迭代它,從每次迭代中接收一個JObject。該對象表示CcFull數組中的單個條目。然後可以使用該屬性名稱作爲索引來檢索該屬性的值。

+0

感謝鮑勃 - 做到了這一招:-) - 另一個問題出現了,Json的格式稍有不同,子項拋出了一個錯誤 – Charlez

+0

無法投射類型爲'Newtonsoft.Json.Linq.JProperty'的對象來鍵入' Newtonsoft.Json.Linq.JObject' - 這個就是我剛剛在示例中添加的FromFull Json數據。這不包括周圍的方括號[] - 並且來自公共API,因此我無法控制Json - 任何想法? – Charlez

+0

我找到了解決方案 - 只是使用strEmail = item.Value(「電子郵件」) - 這個數據只有1行電子郵件和全名 - 不是行集合 - 所以沒有子項目 – Charlez