Возврат нескольких элементов из массива в файл json в vb.net, привязка к датируемым - PullRequest
0 голосов
/ 23 сентября 2019

В настоящее время я разрабатываю выигрышную форму vb.net, в которой используется URL-адрес для возврата файла json, который мне нужно поместить в таблицу данных.Я не уверен, как сделать мою публичную иерархию классов, не делая тысячи строк.Прямо сейчас я пытаюсь перенести всю информацию в текстовое поле, но в конечном итоге помещаю их в таблицу данных для размещения в сетке данных.Вот небольшая часть файла json и URL для загрузки текстовой строки json.

URL: https://api.worldoftanks.com/wot/encyclopedia/vehicles/?application_id=c2b5cb8d6c77098c8a9a481e68476b28&fields=name%2C+tank_id%2C+tier

Небольшой образец файла json:

{
    "status": "ok",
    "meta": {
        "count": 632,
        "page_total": 7,
        "total": 632,
        "limit": 100,
        "page": null
    },
    "data": {
        "1": {
            "tier": 5,
            "name": "T-34",
            "tank_id": 1
        },
        "33": {
            "tier": 5,
            "name": "T14",
            "tank_id": 33
        },
        "49": {
            "tier": 8,
            "name": "Type 59",
            "tank_id": 49
        },
        "81": {
            "tier": 1,
            "name": "Vickers Medium Mk. I",
            "tank_id": 81
        },
        "113": {
            "tier": 1,
            "name": "Kolohousenka",
            "tank_id": 113
        },
        "129": {
            "tier": 1,
            "name": "Strv fm/21",
            "tank_id": 129
        },
        "145": {
            "tier": 6,
            "name": "Pudel",
            "tank_id": 145
        },
        "161": {
            "tier": 1,
            "name": "Fiat 3000",
            "tank_id": 161
        },
        "257": {
            "tier": 5,
            "name": "SU-85",
            "tank_id": 257
        },
        "273": {
            "tier": 6,
            "name": "Hummel",
            "tank_id": 273
        },
        "289": {
            "tier": 3,
            "name": "M3 Stuart",
            "tank_id": 289
        },
        "305": {
            "tier": 7,
            "name": "Type 62",
            "tank_id": 305
        },
        "321": {
            "tier": 3,
            "name": "D2",
            "tank_id": 321
        }}

Проблема здесь в части «данные», я не привык иметь так много подполей, в этом случае вы видите следующие 1, 33, 49, и т. Д. Единственный способ, которым я знаю, как создать открытый классдля этого было бы сделать индивидуальный для каждого числа, и их слишком много для этого.Может ли кто-нибудь указать мне правильное направление для перечисления 3 атрибутов: уровня, имени и tank_id в таблицу данных.Кроме того, для моего другого json-кода я всегда вручную записывал информацию в таблицу данных с циклом for, что является самым худшим способом решения этой проблемы, поэтому любая помощь там также будет принята с благодарностью.

Вот мой код vb.net:

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

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


        Dim uri1string As String = "https://api.worldoftanks.com/wot/encyclopedia/vehicles/?application_id=c2b5cb8d6c77098c8a9a481e68476b28&fields=short_name%2C+tank_id%2C+tier"
        Dim uri1 As New Uri(uri1string)

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

        Dim Response1 As HttpWebResponse = Request1.GetResponse()

        Dim read1 = New StreamReader(Response1.GetResponseStream())
        Dim raw1 As String = read1.ReadToEnd()

        Dim jss1 As New JavaScriptSerializer
        Dim root1 As RootObject1 = jss1.Deserialize(Of RootObject1)(raw1)c

        '------------------Trying to get this to work---------------
        For Each vehicle As Vehicles In root1.data.First().Value.short_name
            TextBox1.Text += vehicle.short_name + vbNewLine
        Next

    End Sub
End Class

Public Class RootObject1
    Public Property status As String
    Public Property meta As Meta1
    Public Property data As Dictionary(Of String, Vehicles)
End Class

Public Class Meta1
    Public Property count As Integer
End Class

Public Class Vehicles
    Public Property tier As String
    Public Property short_name As String
    Public Property tank_id As String
End Class

'Public Class Vdesc
'    Public Property tier As String
'    Public Property short_name As String
'    Public Property tank_id As String
'End Class

--------------------


Я сейчас пытаюсьэто потому, что номера идентификаторов не в порядке и в номерах номеров есть пробелы, например, они могут читать 1, затем 4, а затем 12. Я получаю сообщение об ошибке.

Dim tokenjson = JsonConvert.SerializeObject(uri1)
Dim jsonresult = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(raw1)


Dim dtLookup As New DataTable
'dtLookup.Rows.Add()
dtLookup.Columns.Add()
dtLookup.Columns.Add()
dtLookup.Columns.Add()

For i As Integer = 0 To jsonresult.Count
    dtLookup.Rows.Add()
    dtLookup.Rows(i).Item(0) = jsonresult("data")("" & i + 1 & "")("tier")
    dtLookup.Rows(i).Item(0) = jsonresult("data")("" & i + 1 & "")("name")
    dtLookup.Rows(i).Item(0) = jsonresult("data")("" & i + 1 & "")("tank_id")
Next

Спасибо,

1 Ответ

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

Вы не объяснили, как вам нужны данные, поэтому я просто поместил их в текстовое поле.

Imports Newtonsoft.Json.Linq

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim URL As String = "https://api.worldoftanks.com/wot/encyclopedia/vehicles/?application_id=c2b5cb8d6c77098c8a9a481e68476b28&fields=short_name%2C+tank_id%2C+tier"
        Dim ParseJSON As JObject = JObject.Parse(New Net.WebClient().DownloadString(URL))

        For Each tank As JProperty In ParseJSON("data")
            Dim LineHolder As String = Nothing
            For Each tankinfo As JProperty In tank.First
                LineHolder &= String.Format("{0}: {1}, ", tankinfo.Name, tankinfo.Value)
            Next
            LineHolder = LineHolder.Remove(LineHolder.Length - 2)
            TextBox2.AppendText(LineHolder & Environment.NewLine)
        Next
    End Sub
End Class

enter image description here

...