2013-09-26 5 views
1

Я просто изучаю основы VB 2010, и я пытаюсь разработать программу для поддержки базы данных. У меня есть строка JSON в базе данных, которая содержит список файлов изображений и их соответствующие идентификационные номера. Это в JSON, так как веб-сайт также использует эти данные. Пример кодаДекодирование JSON в Visual Basic 2010 Express

[{"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

+2

Итак ... почему этот помеченный PHP? –

+0

Почему вы говорите, что json.net потерпел неудачу? –

+0

@ DanielA.White Он провалился несколько раз, с моими множественными попытками. Обычно это ошибка конверсии, которая не может получить доступ к дочернему значению. –

ответ

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 
+0

Какой код я использовал бы тогда, если бы я использовал чище JSON? Я могу изменить код веб-сайта, чтобы использовать новый формат. –

+0

@JoshLukeBlease Отредактировано тем, что вам нужно будет изменить. –

Смежные вопросы