【问题标题】:SteamAPI JSON.net Error in VB .netVB .net 中的 SteamAPI JSON.net 错误
【发布时间】:2015-12-27 13:51:15
【问题描述】:

当我尝试反序列化我得到的 JSON 内容时,我真的不明白我做错了什么。

您可以得到http://api.steampowered.com/ISteamApps/GetAppList/v2?format=json的回复

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Public Class Form1

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

        Dim SteamGameInfoObject As Object = JsonConvert.DeserializeObject(Of Object)(New System.Net.WebClient().DownloadString("http://api.steampowered.com/ISteamApps/GetAppList/v2?format=json"))



    End Sub

    Public Class SteamRootObject

        Public Class SteamAPIJSONResult

            Public Property applist As List(Of applistlist)

        End Class

        Public Class applistlist

            Public Property apps As List(Of appslist)

        End Class

        Public Class appslist

            Public Property appid As Integer()
            Public Property name As String()

        End Class

    End Class

End Class

我不知道如何“要修复此错误,请将 JSON 更改为 JSON 数组”

【问题讨论】:

  • 您没有告诉我们错误消息的第一部分,我们无法在没有看到您正在使用的代码的情况下告诉您如何解决该问题。听起来您没有反序列化为数组类型
  • 我要把它编辑成完整的源代码。
  • 你构造了类来保存反序列化的数据,然后没有使用它们。您还应该允许连接和获取 json 可能会失败,将其作为单独的步骤进行
  • 它现在使用构造的类,但我仍然收到错误:“要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型它是一个普通的 .NET 类型”
  • 那些类不应该嵌套,SteamRootObject 是错误的,它应该只是Public Property applist as applistlist,因为可怕的命名applistlist 已经是一个列表。显示的代码没有使用这些类。 As Object 没有告诉反序列化器使用这些类。

标签: arrays json vb.net variables json.net


【解决方案1】:

这里有几个问题:

  1. 您将appidname 分别定义为整数和字符串数组。在 JSON 中,这些是原始值而不是数组,因此 VB.NET 属性本身应声明为简单的整数和字符串。

  2. 您将applist 定义为List(Of applistlist)。尽管名称如此,但 JSON 中的属性值是单个对象而不是数组,因此该属性也应该引用单个对象。

  3. Form1_Load 中,您需要反序列化为正确的类型SteamRootObject。如果你这样做 JsonConvert.DeserializeObject(Of Object)(jsonString) 你并没有告诉 Json.NET 要反序列化的类型!

  4. 从风格上讲,不需要将内部类嵌套在根类中,这增加了复杂性。

有很多在线工具可以从 JSON 自动生成 .Net 类,可以使用 google 快速找到,例如 http://json2csharp.com/(用于 c#)或 http://jsonutils.com/http://www.httputility.net/json-to-csharp-vb-typescript-class.aspx。将来,请使用其中之一来检查您的工作。

因此您的固定类应如下所示:

Public Class App
    Public Property appid As Integer
    Public Property name As String
End Class

Public Class Applist
    Public Property apps As New List(of App)
End Class

Public Class SteamRootObject
    Public Property applist As Applist
End Class

并且,反序列化:

Dim SteamGameInfoObject = JsonConvert.DeserializeObject(of SteamRootObject)(jsonString)

原型fiddle

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-08-18
  • 2020-02-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2022-11-01
相关资源
最近更新 更多