【问题标题】:Decode JSON in Visual Basic 2010 Express在 Visual Basic 2010 Express 中解码 JSON
【发布时间】:2013-09-26 19:43:57
【问题描述】:

我只是在学习 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 升级

【问题讨论】:

  • 那么...为什么这被标记为 PHP?
  • 为什么说json.net失败了?
  • @DanielA.White 我多次尝试失败了多次。它通常是某种“无法访问子值”的转换错误
  • 您需要发布您的 VB 代码。
  • 那个 JSON 看起来很乱。使用身份证号码作为属性是可怕的。我建议你构造一个具有真实属性的 JSON 对象并使用一个数组来压缩它:`[{"ID": 1, "Path": "Image1.jpg"}, {"ID": N, "Path": "ImageN.jpg"}]

标签: arrays json vb.net


【解决方案1】:

由于您的 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

【讨论】:

  • 如果我要使用更干净的 JSON,我会使用什么代码?我可以更改网站的代码以使用新格式。
  • @JoshLukeBlease 编辑了您需要更改的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多