如何使用VB.NET反序列化此JSON

如何使用VB.NET反序列化此JSON,json,vb.net,json.net,Json,Vb.net,Json.net,我有以下JSON数据: {要求:[0.26039995,19.91610429],[0.26063345370.562292],[0.2600001730381.45513902],[0.260000008299.1410574],[0.260000008299],[0.26063345370.562292],[0.260000008299],[0.1410574],[0]已冻结,序号:50663190} 我写了这段代码: Private Sub Button2_Click(sender As

我有以下JSON数据:

{要求:[0.26039995,19.91610429],[0.26063345370.562292],[0.2600001730381.45513902],[0.260000008299.1410574],[0.260000008299],[0.26063345370.562292],[0.260000008299],[0.1410574],[0]已冻结,序号:50663190}

我写了这段代码:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim wc As New WebClient
    Dim sURL As String = "https://poloniex.com/public?command=returnOrderBook&currencyPair=USDT_STR&depth=" & 2
    Dim res As String = wc.DownloadString(New Uri(sURL))

    Dim m As IEnumerable(Of Rootobject) = JsonConvert.DeserializeObject(Of IEnumerable(Of Rootobject))(res)
End Sub


Public Class Rootobject
    Public Property asks As asksDef()
    Public Property bids As bidsDef()
    Public Property isFrozen As String
    Public Property seq As Integer
End Class

Public Class asksDef
    Public Property priceAsk As String
    Public Property quantAsk As Integer
End Class

Public Class bidsDef
    Public Property priceBid As String
    Public Property quantBid As Integer
End Class
我已经用VB paste special粘贴了JSON类。 问题是:如何访问每个询问、每个出价以及IsFrozed和seq值

我在这行上有一个错误:

Dim m As IEnumerable(Of Rootobject) = JsonConvert.DeserializeObject(Of IEnumerable(Of Rootobject))(res)
我收到的错误消息是:

类型的未处理异常 在中发生“Newtonsoft.Json.JsonSerializationException” Newtonsoft.Json.dll

其他信息:无法反序列化当前JSON对象 e、 g.{name:value}转换为类型 'System.Collections.Generic.IEnumerable'1[poloniexAPI.Rootobject]' 因为类型需要JSON数组,例如[1,2,3]来反序列化 没错

要修复此错误,请将JSON更改为JSON数组,例如。 [1,2,3]或更改反序列化类型,使其成为普通的.NET 类型,例如,不是integer之类的基元类型,也不是集合类型 类似于可以从JSON对象反序列化的数组或列表。 还可以将JsonObjectAttribute添加到类型以强制其 从JSON对象反序列化

路径“询问”,第1行,位置8

这次我又被这个JSON模型困住了。如何进行这项工作

{BTC_BCN:{id:7,last:0.00000042,lowstask:0.00000043,highestBid:0.00000042,percentChange:0.00000000,baseVolume:179.56364789,quoteEvolume:436786711.33832335,isfreezed:0,high24hr:0.00000043,low24hr:0.00000039},BTC_BELA:{id:8,last:0.00002091,lowstask:0.00002097,highestBid:0.00002091,percentChange:-0.10831556,baseVolume:12.57891843,quoteEvolume:579476.06165462,isfreezed:0,high24hr:0.00002345,low24hr:0.00002088}}


据我所知,你的问题。 可以使用存储反序列化数据的“m”变量访问属性。
例:m.isfreeze、m.seq、m.bids&m.asks。

此特定错误的根本原因是,您的JSON表示一个包含一些数组和其他信息的对象,但您试图将其反序列化,就好像整个问题都是可枚举的一样。但是,修复此问题并不能解决整个问题;还有一些其他问题

这个JSON有点奇怪,因为它使用一个数组将出价和出价的每个价格和数量对组合在一起,而一个对象似乎更合适,更容易使用。由于JSON.Net没有一个工具可以通过索引将数组自动映射到类属性中,所以您需要使用自定义JsonConverter以正确地反序列化此数据。此外,出于某种原因,价格以字符串形式表示,其中价格应为小数,如数量。这也可以在转换器中处理

在讨论转换器之前,让我们先修复类定义。由于出价和出价使用相同的结构,我建议为此定义一个公共类。价格和数量属性都应声明为十进制:

然后按如下方式定义根类:

Class RootObject
    Public Property asks As List(Of PriceQuantityPair)
    Public Property bids As List(Of PriceQuantityPair)
    Public Property isFrozen As String
    Public Property seq As Integer
End Class
<JsonConverter(GetType(PriceQuantityPairConverter))>
Public Class PriceQuantityPair
    ...
End Class
Dim root As RootObject = JsonConvert.DeserializeObject(Of RootObject)(json)
以下是转换器的代码,它将每对的阵列结构转换为PriceQuantityPair实例:

Class PriceQuantityPairConverter
    Inherits JsonConverter

    Public Overrides Function CanConvert(objectType As Type) As Boolean
        Return objectType Is GetType(PriceQuantityPair)
    End Function

    Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object
        Dim ja As JArray = JArray.Load(reader)
        Dim pair As PriceQuantityPair = New PriceQuantityPair()
        pair.price = ja(0).ToObject(Of Decimal)()
        pair.quantity = ja(1).ToObject(Of Decimal)()
        Return pair
    End Function

    Public Overrides ReadOnly Property CanWrite As Boolean
        Get
            Return False
        End Get
    End Property

    Public Overrides Sub WriteJson(writer As JsonWriter, value As Object, serializer As JsonSerializer)
        Throw New NotImplementedException()
    End Sub
End Class
要使用转换器,请向PriceQuantityPair类添加如下属性:

Class RootObject
    Public Property asks As List(Of PriceQuantityPair)
    Public Property bids As List(Of PriceQuantityPair)
    Public Property isFrozen As String
    Public Property seq As Integer
End Class
<JsonConverter(GetType(PriceQuantityPairConverter))>
Public Class PriceQuantityPair
    ...
End Class
Dim root As RootObject = JsonConvert.DeserializeObject(Of RootObject)(json)

这里是一个演示:

我在dim m as IEnumerable行中得到一个错误…关于JSON的定义…您正在使用的JSON应该是post的一部分,因为它是完整的。因为Object是错误的-您应该创建一个类来保存每个项的2个值。我们不知道数据代表什么,所以使用您的知识来创建它们。该代码不会编译,属性声明应该是…asks作为类名或使其成为IList。最后,我不认为RootObject是一个集合。请阅读并获取问题所必需的数据和错误消息。现在我可以看到JSON,这是非常令人毛骨悚然的-那些Bid/Ask对,[0.26039995,19.91610429]这意味着它是一个包含字符串和十进制而非整数的数组。好吧,你不能像那样混合数据类型并使用Option Strict。就我个人而言,我会编写一个转换器,这样其他代码就不必处理它了。将ask和binds定义为ListOf JArray,你可以将它们引用为m.asks01,但是,它们是J/Object,所以你需要强制转换另一个错误是,正如我所说的,根对象不是集合。请阅读并感谢您的回答,但是:我没有看到十进制/整数定义的错误。在您所有的专业阐述中,我没有得到任何帮助。如果我有您所说的所有知识,我将不会发布问题。继续:什么都不用谢。你自己有很多知识。根对象不是一个可枚举/集合==摆脱IEnumerable。没有人对你持保留态度。阅读所有的单词。即使是那些喜欢阅读并随身携带@SomeOneMore的人 你的最新编辑看起来你在问一个新问题。StackOverflow的一般策略是。与其编辑这篇文章来问一个新的问题,如果它的回答令你满意,那就把它全部发出来,这样它就可以单独处理/回答了。