【问题标题】:Parsing JSON Objects within JSON arrays within JSON Objects in VB.Net在 VB.Net 中的 JSON 对象中解析 JSON 数组中的 JSON 对象
【发布时间】:2016-05-31 09:53:08
【问题描述】:

大家好,感谢您的关注。我对 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

我的最终目标是能够为“Cap5x5”的 playerStatSummaryType 获取诸如“totalChampionKills”之类的元素并将它们插入到 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 是用户名。

当我尝试将与上述相同的逻辑应用于不同子中的较大 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 或类似的东西,我是否必须为每种类型创建一个类?

有什么建议或想法吗?

再次感谢

【问题讨论】:

  • 如果解析 json,通常不需要类,这些类用于反序列化回对象。这些类大多是正确的——playerStatSummaryTypeWrapper 应该有一个Property losses As Integer。一个对象不需要 DGV,PropertyGrid 可能是更好的选择
  • 我能否使用 for 循环将 Jarray 中的每个项目反序列化为 playerStatSummaryTypeWrapper?
  • 是的(顶级类稍微偏离了数组,所以PlayerStatSummaries as playerStatSummaryTypeWrapper()。或者将它们全部反序列化为playerStatSummaryTypeWrapper的数组,也许这样:stackoverflow.com/q/31084143会有所帮助

标签: json vb.net parsing


【解决方案1】:

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

由于aggregatedStats 是它自己的类型,因此在DataGridView 中不会显示任何非常有趣的内容,只有类型名称。有几种方法可以处理这个问题。一种是从 DGV 中隐藏属性,然后当他们更改选定/当前行时,在列表中找到新行并将 player.aggregatedStats 设置为属性网格中的选定对象,用于主详细信息类型视图。玩家统计摘要:

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

&lt;Browsable(False)&gt; 将导致 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 机制(在您在列表中找到那个人之后)。结果:

(这是在我将&lt;Browsable(False)&gt; 添加到班级之前)。您可以将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 纪元日期,很容易转换为 .NET。

【讨论】:

  • 非常感谢 Plutonix!除了在遇到问题时简单地在谷歌上搜索问题之外,您是否知道我可以阅读任何书籍/其他资源以了解有关 vb.net 的更多信息?
  • 如果这回答了问题,请单击答案旁边的复选标记。很快(在 15 个代表处),您将能够为任何告知、教育、惊奇或逗乐您的 Q 或 A 投赞成票。这有助于其他人找到好的答案。学习方面,我偏爱 MSDN。这些文章可能很密集,但它们全面和权威的。它们和演示代码通常至少可以帮助您更好地构建问题,
猜你喜欢
  • 2011-08-04
  • 2021-03-19
  • 1970-01-01
  • 2014-12-02
  • 2015-06-02
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多