2014-01-26 77 views
0

有人可以幫我嗎? 我試圖解析該API的CloudStack是給我在vb.net這個JSON輸出,但我不能讓我的頭周圍無法讓我的頭解析在VB.net中的JSON

從該的CloudStack輸出JSON是:

{ 
    "listcapacityresponse": { 
     "count": 6, 
     "capacity": [ 
      { 
       "type": 8, 
       "zoneid": "f26c2094-f2ca-4951-9265-a3f036e7f045", 
       "zonename": "DBXCP1", 
       "capacityused": 6, 
       "capacitytotal": 18, 
       "percentused": "33.33" 
      }, 
      { 
       "type": 0, 
       "zoneid": "f26c2094-f2ca-4951-9265-a3f036e7f045", 
       "zonename": "DBXCP1", 
       "capacityused": 27246198784, 
       "capacitytotal": 97078222080, 
       "percentused": "28.07" 
      }, 
      { 
       "type": 1, 
       "zoneid": "f26c2094-f2ca-4951-9265-a3f036e7f045", 
       "zonename": "DBXCP1", 
       "capacityused": 13500, 
       "capacitytotal": 52800, 
       "percentused": "25.57" 
      }, 
      { 
       "type": 5, 
       "zoneid": "f26c2094-f2ca-4951-9265-a3f036e7f045", 
       "zonename": "DBXCP1", 
       "capacityused": 3, 
       "capacitytotal": 12, 
       "percentused": "25" 
      }, 
      { 
       "type": 6, 
       "zoneid": "f26c2094-f2ca-4951-9265-a3f036e7f045", 
       "zonename": "DBXCP1", 
       "capacityused": 14978383872, 
       "capacitytotal": 106308304896, 
       "percentused": "14.09" 
      }, 
      { 
       "type": 3, 
       "zoneid": "f26c2094-f2ca-4951-9265-a3f036e7f045", 
       "zonename": "DBXCP1", 
       "capacityused": 92190801920, 
       "capacitytotal": 1099511627776, 
       "percentused": "8.38" 
      } 
     ] 
    } 
} 

我需要能夠將其分解,以便我可以輕鬆可靠地獲得每種類型的「容量使用」,「容量總計」和「使用百分比」,並將這些值分配給vb.net中的數組或單個變量。

我可以選擇以XML格式接收相同的輸出,但不知道如何在vb.net中解析該輸出。哪個更容易?

+1

可能重複[將JSON字符串轉換爲JSON對象](http://stackoverflow.com/questions/8904522/convert-json-string-to-json-object) –

+0

我看過那個,但不能得到我的頭在那裏的例子。 我後來有人拋出了一些建議,我的方式專門與上面的JSON有關,所以我可以希望弄清楚我在做什麼:) – John

+0

你是如何得到這些數據的? –

回答

2

首先,請原諒我,我的VB.NET生鏽至少可以說,我是從C#音譯。我的建議幾乎總是基於XML的JSON。您處理JSON的工具很多。您需要安裝NuGet包Json.NET(或任何其他JSON解串器,但是我將我的示例編碼爲Json.NET)編入您的項目。從那裏你有兩個選擇。第一種,動態分型:

Dim dynamicObj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(jsonString) 
Dim capacity = dynamicObj("listcapacityresponse")("capacity") 
For Each subObj as Object in capacity 
    Console.WriteLine(subObj("capacityused")) 
Next 

這是非常基本的,只是寫出價值。你可以隨心所欲地做。

您的其他選擇是創建DTO(數據傳輸對象)並反序列化爲完全定義的對象。該DTO應類似於以下內容:

Public Class Capacity 
    public type As Integer = Nothing 
    public zoneid As String = Nothing 
    public zonename As String = Nothing 
    public capacityused As Long = Nothing 
    public capacitytotal AS Long = Nothing 
    public percentused As String = Nothing 
End Class 

Public Class Listcapacityresponse 
    public count As Integer = Nothing 
    public capacity As List(Of Capacity) = Nothing 
End Class 

Public Class RootObject 
    public listcapacityresponse As Listcapacityresponse = Nothing 
End Class 

那麼你的代碼來訪問值將如下所示:

Dim dtoObj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of RootObject)(jsonString) 
For Each stuff As Capacity in dtoObj.Listcapacityresponse.capacity 
    Console.WriteLine(stuff.capacityused) 
Next 

使用DTO的一大好處是,你可以很容易地使用LINQ訪問這些值,如下所示:

Dim capacities = From stuff in dtoObj.Listcapacityresponse.capacity Select stuff.capacityused 

我希望這會讓您開始使用Json.NET並瞭解DTO和Dynamic類型的使用。請原諒我可怕的VB.NET,因爲我是一個C#人。

+0

我認爲DTO代表數據傳輸對象是否正確? –

+0

@AndrewMorton你會是對的。 –

+0

小心:如果列表爲空,CloudStack通常會返回一個空值而不是零大小的數組。 –