2014-01-26 25 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通常会返回一个空值而不是零大小的数组。 –