Заполнение TextBox из JSON с помощью JavaScriptSerializer - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь использовать JavaScriptSerializer, чтобы получить некоторую информацию из API веб-сайта.Тем не менее, я новичок в этом на vb.net и не могу получить текстовое поле для загрузки.Я думаю, что это связано с текстом JSON, который я получаю с веб-сайта, где он имеет статус вверху, но я не знаю, как обойти это.

Вот текст JSON:

{
  "status": "ok",
  "meta": {
    "count": 1
  },
  "data": {
    "1000003149": {
      "members": [
        {
          "account_name": "CHOP210"
        },
        {
          "account_name": "Guns_n_Roses"
        },
        {
          "account_name": "vonhames"
        },
        {
          "account_name": "wiggum99"
        },
        {
          "account_name": "VonChalon"
        },
        {
          "account_name": "FokkerDR1"
        },
        {
          "account_name": "Force12"
        },
        {
          "account_name": "m4irish"
        },
        {
          "account_name": "panzer1_14"
        },
        {
          "account_name": "alchemicalgunner007"
        },
        {
          "account_name": "Morrros"
        },
        {
          "account_name": "jonah128"
        },
        {
          "account_name": "Zy4"
        },
        {
          "account_name": "Terminator6644"
        },
        {
          "account_name": "Dionisiovega"
        }
      ]
    }
  }
}

Вот мой код:

Imports System.Net
Imports System.IO
Imports System.Web.Script.Serialization

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim uriString As String = "https://api.worldoftanks.com/wot/clans/info/?application_id=c2b5cb8d6c77098c8a9a481e68476b28&clan_id=1000003149&fields=members.account_name"
        Dim uri As New Uri(uriString)

        Dim Request As HttpWebRequest = HttpWebRequest.Create(uri)
        Request.Method = "GET"

        Dim Response As HttpWebResponse = Request.GetResponse()

        Dim Read = New StreamReader(Response.GetResponseStream())
        Dim Raw As String = Read.ReadToEnd()

        Dim dict As Object = New JavaScriptSerializer().Deserialize(Of List(Of Object))(Raw)

        For Each item As Object In dict
            TextBox1.Text += item("account_name").ToString + vbNewLine
        Next

    End Sub

End Class 

Я думаю, что причина, по которой текстовое поле не будет загружено, связана с состоянием ичасть данных текста JSON.Сейчас я просто заполняю многострочное текстовое поле, но позже мне понадобится связать их с полем со списком учетных записей.

1 Ответ

1 голос
/ 20 сентября 2019

Проблема в том, что вы пытаетесь десериализовать JSON как List(Of Object), но JSON на самом деле не является списком;вместо этого это ряд вложенных объектов, причем самый внутренний объект содержит список членов.(Я переформатировал JSON в вашем вопросе, чтобы сделать его более понятным, как все структурировано.) Вам нужно создать классы для моделирования JSON и затем десериализовать в эту модель.
Одна странность в вашем JSON - это 1000003149ключ, который я предполагаю, является динамическим (похоже, что это соответствует идентификатору клана в URL).Поэтому вам понадобится словарь для обработки этой части.

Вот классы, которые соответствуют JSON:

Public Class RootObject
    Public Property status As String
    Public Property meta As Meta
    Public Property data As Dictionary(Of String, Clan)
End Class

Public Class Meta
    Public Property count As Integer
End Class

Public Class Clan
    Public Property members As List(Of Member)
End Class

Public Class Member
    Public Property account_name As String
End Class

Затем вы можете десериализовать и заполнить ваш TextBox следующим образом:

Dim jss As New JavaScriptSerializer
Dim root As RootObject = jss.Deserialize(Of RootObject)(Raw)

For Each member As Member In root.data.First().Value.members
    TextBox1.Text += member.account_name + vbNewLine
Next
...