在Visual Basic 2010 Express中解码JSON

时间:2013-09-26 19:43:57

标签: arrays json vb.net

我正在学习VB 2010中的基础知识,我正在尝试设计一个程序来维护数据库。我在数据库中有一个JSON字符串,其中包含一个图像文件列表及其相关的ID号。这是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

注意,我无法从Visual Basic 2010 Express升级

1 个答案:

答案 0 :(得分:3)

因为您的JSON具有数字键而不是预期键,所以很难定义自定义类型以匹配它。我相信你最好的选择是反序列化为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" }
]

它会反序列化为一个Target对象,而不是一个。但如果你坚持使用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