iProgramIt Ответов: 2

Проблема десериализации JSON: список (элементов) в VB.NET


Привет.
У меня есть еще одна проблема десериализации JSON, и она меня расстраивает. У меня была предыдущая проблема десериализации (Как десериализовать "многоуровневый" JSON в VB.NET?[^]), и это было быстро решено. Но я последовал инструкциям, чтобы повторить это с еще одной строкой JSON, и она выдает ту же ошибку. Вот код, который я пытаюсь десериализовать:
{"timestamp":1470270507172,"profileId":"e7cc8ec97b294d2484843d330f136bbd","profileName":"iProgramIt","textures":{"SKIN":{"url":"http://textures.minecraft.net/texture/f7f6f0e6a2a3d6db69a4afa9fef28ea4d56f37199277f95c1d2b5f0aaa4e2"}}}

Он застревает на коже.
Вот мой код в VB.NET.
Public Class SKIN
       Public Property url As List(Of String)
   End Class

   Public Class CAPE
       Public Property url As List(Of String)
   End Class
   Public Class PropertyX
       Public Property name As String
       Public Property value As String
       Public Property signature As String
   End Class

   Public Class Skins_Base
       Public Property id As String
       Public Property name As String
       Public Property properties As List(Of PropertyX)
   End Class
   Public Class Textures
       Public Property SKIN As List(Of SKIN)
       Public Property CAPE As List(Of CAPE)
   End Class

   Public Class Skins
       Public Property timestamp As String
       Public Property profileId As String
       Public Property profileName As String
       Public Property isPublic As String
       Public Property textures As List(Of Textures)
   End Class

Public Function GETX(ByVal Str As String) As String
       Dim wc As New System.Net.WebClient
       Return wc.DownloadString(Str)
   End Function


Десериализация (где возникает ошибка):
Dim SkinsBase As String = GETX("https://sessionserver.mojang.com/session/minecraft/profile/" & obj.id)
        Dim xObj = JsonConvert.DeserializeObject(Of Skins_Base)(SkinsBase)
        Dim b As Byte() = Convert.FromBase64String(xObj.properties(0).value)
        Dim bString As String = System.Text.Encoding.UTF8.GetString(b)
        Dim b64 = JsonConvert.DeserializeObject(Of Skins)(bString)
        MsgBox(b64.textures(0).SKIN(0).url(0))


Заранее спасибо.
-ипрограммировать

Что я уже пробовал:

http://www.codeproject.com/Questions/1116304/How-do-I-deserialise-multi-level-JSON-in-VB-NET. Теперь этот вопрос не решился. Погуглил и ничего не соответствует этому обстоятельству.

Afzaal Ahmad Zeeshan

Потому что ничто не будет соответствовать вашим потребностям. В JSON, { } имею в виду объект. Ваш документ JSON основан на объекте,
{ "timestamp": 1470270507172, ... }
Чтобы десериализовать объект, вам нужно десериализовать его в объект, а не в массив объектов. Во-вторых, ваш JSON и объекты не похожи. Их очень трудно отследить, и библиотека не сможет сама понять, как сопоставить, какой из них с каким. Прочтите эту мою статью, чтобы узнать больше об этом, От нуля до героя в JSON с C#.

iProgramIt

Что бы вы посоветовали мне сделать-то есть исправить это?

Afzaal Ahmad Zeeshan

Пожалуйста, прочтите мою статью, в ней есть руководство. Проблема в том, что ваш тип не может быть сопоставлен из-за несоответствия имен.

Измените их имена в JSON, если вы не можете изменить схему JSON, то, пожалуйста, измените определение вашего типа.

iProgramIt

Я не могу изменить имена. Но [простите меня за то, что я нуб], как мне изменить определение типа? Можете ли вы указать мне, какие из них изменить и т. д.?

Afzaal Ahmad Zeeshan

Измените имена свойств вашего типа Skins_Base.

iProgramIt

Для меня это ничего не значит. Есть еще предложения? На самом деле я получаю новую ошибку. Поскольку имена свойств Skin_Base должны быть такими, и я не могу их заменить, Newtonsoft.Json не распознает "пользовательские" имена. Все равно спасибо.

2 Ответов

Рейтинг:
2

Bernhard Hiller

При сравнении ваших определений классов и текста Json у меня сложилось впечатление, что вы получили Skins объект-но: textures собственность-это не List(Of Textures), но один объект типа Textures.


iProgramIt

Я все еще получаю тот же вопрос, что и раньше.

Рейтинг:
1

Member 12599808

почему бы тебе не выполнить десериализацию JSON в словарь из(строка,объект) и то свойство вашего класса.
Потому что я думаю, что для многоуровневого json это не может быть легко десериализовано, потому что вы должны сделать точную структуру класса для вашего json с точными именами и их свойствами.


iProgramIt

Это точная структура. И я десериализовал многоуровневый JSON. На этот раз, похоже, у меня есть проблема, которую я не могу решить, используя то же самое решение. Пожалуйста, смотрите http://www.codeproject.com/Questions/1116304/How-do-I-deserialise-multi-level-JSON-in-VB-NET