【问题标题】:JSON.Net Cannot deserialize the current JSON arrayJSON.Net 无法反序列化当前 JSON 数组
【发布时间】:2017-04-10 02:45:17
【问题描述】:

我正在尝试为 LoL 制作一个程序,允许用户查看玩家的特定统计数据。但是,我遇到了问题..

我得到的错误是。

附加信息:无法反序列化当前 JSON 数组 (例如 [1,2,3])输入“WindowsApplication1.Form1+Rootobject” 因为该类型需要一个 JSON 对象(例如 {"name":"value"}) 正确反序列化。

这是我目前的代码。

Public Class Rootobject
        Public Property games As Integer
        Public Property winPercent As Double
        Public Property order As List(Of Class1)
        Public Property role As String
    End Class

    Public Class Class1
        Public Property order() As String
    End Class

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim client As WebClient = New WebClient()
        client.Headers.Add("Content-Type", "application/json")
        Dim reply As String = client.DownloadString("skills/mostPopular?api_key=")
        Dim rootObject As Rootobject = JsonConvert.DeserializeObject(Of Rootobject)(reply)
        MsgBox(rootObject.games)
    End Sub 

这是 JSON 的样子。 (我发布了一个 URL,但它需要一个 API 密钥)

[
  {
    "games": 1650,
    "winPercent": 46.9,
    "order": [
      "Q",
      "W",
      "E",
      "Q",
      "Q",
      "R",
      "Q",
      "W",
      "Q",
      "W",
      "R",
      "W",
      "W",
      "E",
      "E",
      "R",
      "E",
      "E"
    ],
    "role": "Support"
  },
  {
    "games": 9769,
    "winPercent": 51.8,
    "order": [
      "Q",
      "W",
      "E",
      "Q",
      "Q",
      "R",
      "Q",
      "W",
      "Q",
      "W",
      "R",
      "W",
      "W",
      "E",
      "E",
      "R",
      "E",
      "E"
    ],
    "role": "Middle"
  }
] 

【问题讨论】:

  • 在尝试将 .NET 对象结构与 JSON 匹配时,我经常创建一个临时方法,创建一个新的临时对象(在您的情况下,Rootobject 的实例用虚拟数据填充它(确保我已经填充了每个可序列化的属性),然后将其序列化为 JSON。然后我知道 JSON 是什么预期的,我并没有陷入黑暗。

标签: vb.net json.net


【解决方案1】:

更新根对象。有问题的 JSON 解析为以下类

Public Class Rootobject
    Public Property games As Integer
    Public Property winPercent As Double
    Public Property order As String()
    Public Property role As String
End Class

当数据是集合时,您还尝试将数组反序列化为单个对象。

Dim rootObjects As List(Of Rootobject) = JsonConvert.DeserializeObject(Of List(Of Rootobject))(reply)

【讨论】:

  • 太棒了!我将如何在 order 中迭代数据会是一个 for 循环吗?
  • ForForEach 将作为 order 可枚举。
【解决方案2】:

您的 Json 字符串是 RootObjects 的数组。 将预期对象更改为列表

Dim objects As List(Of Rootobject) = JsonConvert.DeserializeObject(Of List(Of Rootobject))(reply)

Dim root As Rootobject = objects.First()
MessageBox.Show(root.games)

@Nkosi 注意到的第二个错误 - 按照他的建议更改 Rootobject

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2020-03-09
  • 2015-05-06
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多