2013-09-26 67 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编辑与你需要改变。 –

相关问题