2016-05-12 24 views
0

變量屬性名我試圖反序列化JSON以下爲內部應用程序反序列化JSON。在VB.NET

{ 
    "resources": [ 
    "output.ogg", 
    "output.m4a", 
    "output.mp3", 
    "output.ac3" 
    ], 
    "spritemap": { 
    "click": { 
     "start": 0, 
     "end": 0.23034013605442177, 
     "loop": false 
    }, 
    "CoinCMixed": { 
     "start": 2, 
     "end": 2.222448979591837, 
     "loop": false 
    }, 
    "CoinDropMixed": { 
     "start": 4, 
     "end": 4.312222222222222, 
     "loop": false 
    } 
    } 
} 

我需要的名稱(如「點擊」)和startend值。

的問題是,這個名字並不總是相同的事情。它是獨一無二的。所以,我猜我需要做的是循環spritemap?但我不知道該怎麼做。

因此,舉例來說:

  • 名稱:CoinDropMixed
  • 開始:4
  • 結束:4.3122222

這將讓我做

msgbox("Your song name is " + Name + "The length is " + start + "The end is" + end) 
+0

編輯,我添加了整個JSON – user3851593

回答

0

您可以處理使用Dictionary變化的名稱。定義你的類是這樣的:

Class DataObject 
    Public Property resources As List(Of String) 
    Public Property spritemap As Dictionary(Of String, Sound) 
End Class 

Class Sound 
    Public Property start As Double 
    Public Property [end] As Double 
    Public Property [loop] As Boolean 
End Class 

然後你可以deserilalize像這樣JSON:

Dim data As DataObject = JsonConvert.DeserializeObject(Of DataObject)(json) 

然後,您可以遍歷所有的字典這樣得到你想要的數據:

For Each kvp As KeyValuePair(Of String, Sound) In data.spritemap 
    Console.WriteLine("Name: " + kvp.Key) 
    Console.WriteLine("Start: " + kvp.Value.start.ToString()) 
    Console.WriteLine("End: " + kvp.Value.end.ToString()) 
    Console.WriteLine() 
Next 

小提琴:https://dotnetfiddle.net/TxSy0i

+0

謝謝!這工作 – user3851593

0

如果名稱是varibale,它很難反序列化並使用反射檢查對象。

也是你的格式不正確的JSON,你需要一個根容器{}

{ 
    "click": { 
    "start": 0, 
    "end": 0.23034013605442177, 
    "loop": false 
    }, 
    "CoinCMixed": { 
    "start": 2, 
    "end": 2.222448979591837, 
    "loop": false 
    }, 
    "CoinDropMixed": { 
    "start": 4, 
    "end": 4.312222222222222, 
    "loop": false 
    } 
} 

在這種情況下,它可能是一個很好的解決方案,以手工解析JSON字符串。 這是我的解決方案(未測試)

dim s as String = "JSON TEXT" 
dim level as Integer = 0 
dim stringStatus as Integer = 0 
dim tmp as String ="" 
dim result as List(Of String) = new List(Of String) 
for i as Integer =0 to (s.Length -1) 
    String c = s.Chars(i) 
    if c="{" then level = level +1 
    if c="}" then level = level -1 
    if (c="""" or c="'") and stringStatus = 0 then stringStatus = 1 
    elseif (c="""" or c="'") and stringStatus = 1 then 
     stringStatus = 0 
     if level = 1 then result.add(tmp) 
     tmp="" 
    elseif stringStatus = 1 then 
     tmp = tmp + c 
    end if 
next 

現在結果中包含您的名字的列表.... 在此基礎上工作,就可以retreive其他數據一樣的開始,結束,循環,對每個節點.. 。

+0

似乎沒有工作我所有。奇。 – user3851593