2016-11-25 2 views
0

Я пытаюсь создать программу для LoL, которая позволит пользователям просматривать определенную статистику для игрока. Однако у меня возникают проблемы.JSON.Net Невозможно десериализовать текущий массив JSON

Ошибка, которую я получаю.

Дополнительная информация: Не может десериализации текущий массив JSON (например, [1,2,3]) в тип 'WindowsApplication1.Form1 + Rootobject' , так как тип требует объект JSON (например, { "имя": "value"}) до десериализовать правильно.

Это код, который у меня есть.

Public Class Rootobject 
     Public Property games As Integer 
     Public Property winPercent As Double 
     Public Property order As List(Of Class1) 
     Public Property role As String 
    End Class 

    Public Class Class1 
     Public Property order() As String 
    End Class 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim client As WebClient = New WebClient() 
     client.Headers.Add("Content-Type", "application/json") 
     Dim reply As String = client.DownloadString("skills/mostPopular?api_key=") 
     Dim rootObject As Rootobject = JsonConvert.DeserializeObject(Of Rootobject)(reply) 
     MsgBox(rootObject.games) 
    End Sub 

Вот как выглядит JSON. (Id опубликовать URL, но это требует ключа API)

[ 
    { 
    "games": 1650, 
    "winPercent": 46.9, 
    "order": [ 
     "Q", 
     "W", 
     "E", 
     "Q", 
     "Q", 
     "R", 
     "Q", 
     "W", 
     "Q", 
     "W", 
     "R", 
     "W", 
     "W", 
     "E", 
     "E", 
     "R", 
     "E", 
     "E" 
    ], 
    "role": "Support" 
    }, 
    { 
    "games": 9769, 
    "winPercent": 51.8, 
    "order": [ 
     "Q", 
     "W", 
     "E", 
     "Q", 
     "Q", 
     "R", 
     "Q", 
     "W", 
     "Q", 
     "W", 
     "R", 
     "W", 
     "W", 
     "E", 
     "E", 
     "R", 
     "E", 
     "E" 
    ], 
    "role": "Middle" 
    } 
] 
+0

При попытке совпасть структуру объекта .NET с JSON, я довольно часто создаю временный метод, создать новый объект временного (в вашем случае экземпляр 'Rootobject' заполнить его с фиктивными данными (удостоверяясь что я заполнил каждое свойство serializable), а затем сериализуем его в JSON. Тогда я знаю, что ожидается JSON, и я не в темноте. – parvee

ответ

2

обновления корневого объекта. JSON в вопросе решает ниже класс

Public Class Rootobject 
    Public Property games As Integer 
    Public Property winPercent As Double 
    Public Property order As String() 
    Public Property role As String 
End Class 

Вы также пытаетесь десериализацией массива в один объект, когда данные сборник.

Dim rootObjects As List(Of Rootobject) = JsonConvert.DeserializeObject(Of List(Of Rootobject))(reply) 
+0

Удивительно, что это работает! Как бы я перебирал данные в * порядке * был бы цикл for? – DoomBots

+0

'' For' или 'ForEach' будет работать как' order' перечислим. – Nkosi

2

Ваша строка Json является массив RootObjects. Изменения ожидается объект в список

Dim objects As List(Of Rootobject) = JsonConvert.DeserializeObject(Of List(Of Rootobject))(reply) 

Dim root As Rootobject = objects.First() 
MessageBox.Show(root.games) 

И второй ошибку замеченного @Nkosi - изменение Rootobject как он предложить

+0

Спасибо за вашу помощь! – DoomBots