在VB.Net中的JSON对象中解析JSON数组中的JSON对象

时间:2016-02-18 23:59:59

标签: json vb.net parsing

大家好,谢谢你们。我对vb.net比较新,而且在vb中解析json非常新。我正在使用JSON.Net,我正在寻找从以下JSON收集数据。

http://hastebin.com/bagiyetece.apache

我为每个"部分"创建了课程。我不确定正确的术语。

第一课:

Public Class StatsWrapper
    Public SummonerID as Long
    Public PlayerStatSummaries as playerStatSummaryTypeWrapper
End Class

第二类:

Public Class playerStatSummaryTypeWrapper
    Public playerStatSummaryType As String
    Public wins As Long
    Public modifyDate As Long
    Public aggregatedStats As aggregatedStatsWrapper
End Class

第三课:

http://hastebin.com/qopanafabe.php

我的最终目标是能够获得像" totalChampionKills"等元素。对于#34; Cap5x5"的playerStatSummaryType;并将它们插入到datagridview中。

我已经能够通过使用JObject.Parse正确解析以下JSON。

{"UserName":{"id":84737282,"name":"UserName","profileIconId":660,"summonerLevel":30,"revisionDate":1455686689000}}

要获取id对象,我会使用:

Dim JSONDerulo = JObject.Parse(JSONResponse)
Dim SummonerID = JSONDerulo(LCase(ToolStripTextBox1.Text))("id")

ToolStripTextBox1.Text是UserName。

当我尝试将上述相同的逻辑应用于不同子类中的较大JSON文件时:

Dim JSONDerulo = JObject.Parse(JSONResponse)
Dim PlayerStatSummaries = JSONDerulo("playerStatSummaries")
Dim Jarray As JArray = PlayerStatSummaries

我可以做类似的事情:

For Each obj As JObject In Jarray
    TextBox2.Text = TextBox2.Text + Environment.NewLine + obj.ToString + Environment.NewLine
Next

或者调用Jarray(1)并再次解析,但每个UserName的游戏类型列表将有所不同。我确实为每种游戏类型都有一个主列表:

AramUnranked5x5, Ascension, Bilgewater, CAP5x5, CoopVsAI, CoopVsAI3x3, CounterPick, FirstBlood1x1, FirstBlood2x2, Hexakill, KingPoro, NightmareBot, OdinUnranked, OneForAll5x5, RankedPremade3x3, RankedPremade5x5, RankedSolo5x5, RankedTeam3x3, RankedTeam5x5, SummonersRift6x6, Unranked, Unranked3x3, URF, URFBots

如果我想(例如)调用AramUnranked5x5.TotalChampionKills或类似的东西,我必须为每种类型创建一个类吗?

有任何建议或想法吗?

再次感谢

1 个答案:

答案 0 :(得分:0)

注意:发布的json比链接到描述的可怕的aggregatedStatsWrapper类要短得多且简单得多!没有数据,我不能说它是否正确。

由于aggregatedStats是它自己的类型,因此在DataGridView中只会显示类型名称。有几种方法可以解决这个问题。一种是从DGV隐藏属性,然后当它们更改所选/当前行时,在列表中找到新的行,并在属性网格中将player.aggregatedStats设置为主 - 详细类型视图的选定对象。 Playerstatsummary:

Public Class Playerstatsummary
    Public Property playerStatSummaryType As String
    Public Property wins As Integer
    Public Property modifyDate As Long
    <Browsable(False)>
    Public Property aggregatedStats As Aggregatedstats
    Public Property losses As Integer
End Class

<Browsable(False)>将导致TypeName未显示在DGV中:

Dim jstr = File.ReadAllText("C:\Temp\myjsonfilename")

Dim jobj = JObject.Parse(jstr)
Dim players = JsonConvert.DeserializeObject(Of List(Of Playerstatsummary))(jobj("playerStatSummaries").ToString)

首先解析它,你可以跳过那个外部容器。 jobj("playerStatSummaries").ToString将要反序列化的属性数据传递给List

您可以轻松地显示您拥有的内容而无需循环播放:

dgv1.DataSource = players

除非你确切地解决了这门课程,否则它还不会知道Aggregatedstats。在此之前,将显示类型名称。帖子提到仅对Cap5x5感兴趣。在这种情况下,PropertyGrid可能是一个更好的UI机制(在列表中找到那个人之后)。结果:

enter image description here enter image description here

(这是在我将<Browsable(False)>添加到课程之前)。您可以像这样详细显示aggregatedStats

Private Sub DataGridView1_SelectionChanged(...etc
    If DataGridView1.SelectedRows.Count = 0 Then Return

    Dim thisOne = DataGridView1.SelectedRows(0).Cells(0).Value.ToString

    Dim player = players.FirstOrDefault(Function(f) f.playerStatSummaryType = thisOne)
    If player IsNot Nothing Then
        PropertyGrid1.SelectedObject = player.aggregatedStats
    End If
End Sub

如果您想知道,日期几乎肯定是Unix Epoch日期,很容易转换为.NET。