当我尝试反序列化我得到的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数组”
答案 0 :(得分:1)
这里有一些问题:
您将appid
和name
分别定义为整数和字符串数组。在JSON中,这些是原始值而不是数组,因此VB.NET属性本身应该被声明为简单的整数和字符串。
您将applist
定义为List(Of applistlist)
。尽管名称如此,但JSON中的属性值是单个对象而不是数组,因此该属性也应引用单个对象。
在Form1_Load
中,您需要反序列化为正确的类型SteamRootObject
。如果你做JsonConvert.DeserializeObject(Of Object)(jsonString)
,你不会告诉Json.NET要反序列化的类型!
在风格上,没有必要将内部类嵌套在根类中,这增加了复杂性。
有很多在线工具可以自动生成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。