2013-09-26 98 views
1

我只是在學習VB 2010中的基礎知識,而我正在設計一個程序來維護一個數據庫。我在數據庫中有一個JSON字符串,其中包含圖像文件列表及其相關ID號。這是在JSON中,因爲網站也使用這些數據。 示例代碼是在Visual Basic 2010 Express中解碼JSON

[{"ID": 0, "Path": "Image0.jpg"},{"ID": 1, "Path": "Image1.jpg"}, {"ID": 2, "Path": "Image2.jpg"},{"ID": 3, "Path": "Image3.jpg"}] 

我一直在使用JSON.NET試過,但我是新手,不知道爲什麼它不工作。

我希望有一種方式可以返回圖像文件,例如在php $DecodedArray[0]會工作,我正在尋找一種方法來在Visual Basic中進行復制。

Imports System.Web.Script.Serialization 
Module Module1 

Public Class Target 
    Public ID, Image As String 
End Class 

Sub Main() 
    Console.Clear() 
    Dim ser As New JavaScriptSerializer() 
    Dim input As String = My.Computer.FileSystem.ReadAllText("JSONFile.txt") 
    '[{"ID": 0, "Path": "Image0.jpg"},{"ID": 1, "Path": "Image1.jpg"}, {"ID": 2, "Path": "Image2.jpg"},{"ID": 3, "Path": "Image3.jpg"}] 
    Console.WriteLine(input) 
    Console.WriteLine() 
    Dim output As Target = ser.Deserialize(Of Target)(input) 
    Console.Write(output.ID.0) 
    Console.ReadKey() 
End Sub 

End Module 

有了這個代碼,我想輸出是Image0.jpg

注意,因爲你的JSON有數字鍵,而不是預期的鍵我無法從Visual Basic 2010速成

升級
+2

那麼...爲什麼這個標記的PHP? –

+0

你爲什麼說json.net失敗了? –

+0

@ DanielA.White我多次嘗試失敗多次。它通常是某種「無法訪問子值」的轉換錯誤 –

回答

3

,定義自定義類型以匹配它會很困難。我相信你最好的選擇是反序列化爲一個Dictionary(Of String, String) - 這將正確反序列化,並且你可以通過字典讀取你的項目。

所以:

Dim output = ser.Deserialize(Of Dictionary(Of String, String))(input) 
For Each key As String In output.Keys 
    Console.WriteLine("{0}: {1}", key, output(key)) 
Next 

通常,當你定義一個普通的類型,你必須知道的JSON屬性的名稱。鑑於你Target類,你的JSON實際上是這樣的:

[ 
    { "ID":"0", "Image":"Image0.jpg" }, 
    { "ID":"1", "Image":"Image1.jpg" }, 
    { "ID":"2", "Image":"Image2.jpg" } 
] 

而且,它還將反序列化爲目標對象的數組,而不是單一的一個。但是如果你堅持使用的是JSON,那麼Dictionary就是要走的路。

如果你能夠從這裏使用更清潔的JSON,你的代碼是正確的。您只需反序列化爲數組,然後就可以訪問該數組的元素。所以:

Dim output = ser.Deserialize(Of Target())(input) 
For i As Integer = 0 To output.GetUpperBound(0) 
    Console.WriteLine("{0}: {1}", output(i).ID, output(i).Image) 
Next 
+0

我會使用什麼代碼如果我要使用更乾淨的JSON?我可以更改網站的代碼以使用新格式。 –

+0

@JoshLukeBlease編輯與你需要改變。 –

相關問題