Arrays 在Visual Basic 2010 Express中解码JSON

Arrays 在Visual Basic 2010 Express中解码JSON,arrays,json,vb.net,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,但我

我只是在学习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]
中可以使用,我正在寻找一种在visualbasic中复制这种方法的方法

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升级,因为您的JSON具有数字键而不是预期键,因此很难定义与之匹配的自定义类型。我相信你最好的选择是反序列化到一个
字典(字符串,字符串)
-这将正确地反序列化,你可以阅读字典来获取你的项目

因此:

通常,在定义常规类型时,必须知道JSON属性的名称。给定您的
Target
类,您的JSON实际上看起来像:

[
    { "ID":"0", "Image":"Image0.jpg" },
    { "ID":"1", "Image":"Image1.jpg" },
    { "ID":"2", "Image":"Image2.jpg" }
]
它将反序列化为目标对象数组,而不是单个对象。但是,如果您仍然坚持使用现有的JSON,那么
字典
就是最好的选择

如果您能够从这里使用更干净的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

由于JSON具有数字键而不是预期键,因此很难定义与之匹配的自定义类型。我相信你最好的选择是反序列化到一个
字典(字符串,字符串)
-这将正确地反序列化,你可以阅读字典来获取你的项目

因此:

通常,在定义常规类型时,必须知道JSON属性的名称。给定您的
Target
类,您的JSON实际上看起来像:

[
    { "ID":"0", "Image":"Image0.jpg" },
    { "ID":"1", "Image":"Image1.jpg" },
    { "ID":"2", "Image":"Image2.jpg" }
]
它将反序列化为目标对象数组,而不是单个对象。但是,如果您仍然坚持使用现有的JSON,那么
字典
就是最好的选择

如果您能够从这里使用更干净的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

所以为什么这个标签是PHP?为什么你说json.net失败了?@DanielA.White它失败了多次,我多次尝试。这通常是某种类型的转换错误,它“无法访问子值”,您需要发布您的VB代码。使用ID号作为属性是可怕的。我建议您构造一个具有真实属性的JSON对象,并使用一个数组来压缩它:`[{“ID”:1,“Path”:“Image1.jpg”},{“ID”:N,“Path”:“ImageN.jpg”},所以。。。为什么这个标签是PHP?为什么你说json.net失败了?@DanielA.White它失败了多次,我多次尝试。这通常是某种类型的转换错误,它“无法访问子值”,您需要发布您的VB代码。使用ID号作为属性是可怕的。我建议您构造一个具有真实属性的JSON对象,并使用数组对其进行压缩:`[{“ID”:1,“Path”:“Image1.jpg”},{“ID”:N,“Path”:“ImageN.jpg”}]如果要使用更干净的JSON,我会使用什么代码?我可以更改网站的代码以使用新格式。@Josh Lukebrease编辑了您需要更改的内容。如果我要使用更干净的JSON,我会使用什么代码?我可以更改网站的代码以使用新的格式。@Josh Lukebrease编辑了您需要更改的内容。