大家好,谢谢你们。我对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或类似的东西,我必须为每种类型创建一个类吗?
有任何建议或想法吗?
再次感谢
答案 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机制(在列表中找到那个人之后)。结果:
(这是在我将<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。