当我试图对我得到的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数组"
这里有一些问题:
-
将
appid
和name
分别定义为整数数组和字符串数组。在JSON中,这些是基元值,而不是数组,因此VB.NET属性本身应该声明为简单的整数和字符串。 -
您将
applist
定义为List(Of applistlist)
。尽管有名称,JSON中的属性值是单个对象,而不是数组,因此该属性也应该引用单个对象。 -
在
Form1_Load
中,您需要反序列化为正确的类型SteamRootObject
。如果执行JsonConvert.DeserializeObject(Of Object)(jsonString)
,则不会告诉Json.NET要反序列化的类型! -
从风格上讲,不需要将内部类嵌套在根类中,这会增加复杂性。
有很多在线工具可以从JSON中自动生成.Net类,例如,可以使用谷歌快速找到这些工具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)
小提琴原型。