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

时间:2017-12-18 17:41:26

标签: json vb.net json.net

我有这个JSON数据:

  

{"询问":[[" 0.26039995",19.91610429],[" 0.26063345",3070.562292]]"出价&#34 ;:[[" 0.26000017",30381.45513902],[" 0.26000000",8299.1410574]]"的isFrozen":" 0&#34 ;, " SEQ":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类。 问题是:如何访问每个ask,每个bid以及isFrozenseq值。

我在这一行收到错误:

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

我收到的错误信息是:

  

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

     

其他信息:无法反序列化当前的JSON对象   (例如{" name":" value"})进入类型   ' System.Collections.Generic.IEnumerable`1 [poloniexAPI.Rootobject]'   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。

     

要修复此错误,请将JSON更改为JSON数组(例如   [1,2,3])或更改反序列化类型,使其成为正常的.NET   type(例如,不是像整数这样的基本类型,不是集合类型   像数组或List一样,可以从JSON对象反序列化。   JsonObjectAttribute也可以添加到类型中以强制它   从JSON对象反序列化。

     

路径'询问',第1行,第8位。

我这次使用这个JSON模型再次陷入困境。如何处理?

  

{" BTC_BCN" {" ID":7,"最后":" 0.00000042"" lowestAsk&# 34;:" 0.00000043"" highestBid":" 0.00000042"" percentChange":" 0.00000000" " baseVolume":" 179.56364789"" quoteVolume":" 436786711.33832335""的isFrozen":&# 34; 0"" high24hr":" 0.00000043"" low24hr":" 0.00000039"}" BTC_BELA" {" ID":8,"最后":" 0.00002091"" lowestAsk":" 0.00002097 "" highestBid":" 0.00002091"" percentChange":" -0.10831556"" baseVolume&# 34;:" 12.57891843"" quoteVolume":" 579476.06165462""的isFrozen":" 0&#34 ;, " high24hr":" 0.00002345"" low24hr":" 0.00002088"}}

2 个答案:

答案 0 :(得分:0)

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

这个JSON有点奇怪,因为它使用一个数组将每个价格和数量对分组为出价和问题,而一个对象似乎更合适(并且更容易消耗)。由于Json.Net没有通过索引自动将数组映射到类属性的工具,因此您需要使用自定义function parseJSON() { var list = $('<ul class="softwares">'); var url = window.URL || window.webkitURL; jsonArrayOfUsers.forEach(function(user) { var currentuser = user.username; var currentavatar = user.avatar; console.log(currentuser); var img = $('<img>', { id: user.username, width: 'auto', height: '100px' })[0]; $('<li class ="softwares">').append( $('<p>').append(img), $('<p>', {text: user.fullName}), $('<p>', {text: user.username}), $('<p>', {text: user.university}), $('<p>', {text: user.userType}) ).appendTo(list) if (jsonArrayOfUsers[i].avatar == null) { } else { var xhr = new XMLHttpRequest(); xhr.open("GET", "URL TO API" + user.avatar); xhr.setRequestHeader("Authorization", localStorage.token); xhr.responseType = 'blob'; xhr.onload = function response(e) { img.onload = function() { url.revokeObjectURL(this.src); } img.src = url.createObjectURL(xhr.response); }; xhr.send(); } }) $('.people').append(list); } 来正确反序列化此数据。此外,价格由于某种原因表示为字符串,它们应该是小数,如数量。这也可以在转换器中处理。

在我们进入转换器之前,让我们修复你的类定义。由于出价和要求使用相同的结构,我建议为此定义一个公共类。 JsonConverterprice属性都应声明为quantity

Decimal

然后像这样定义你的根类:

Public Class PriceQuantityPair
    Public Property price As Decimal
    Public Property quantity As Decimal
End Class

以下是转换器的代码,它将每对的数组结构转换为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 实例:

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 类添加<JsonConverter>属性,如下所示:

PriceQuantityPair

最后,将JSON反序列化为<JsonConverter(GetType(PriceQuantityPairConverter))> Public Class PriceQuantityPair ... End Class 类,如下所示:

RootObject

以下是演示:https://dotnetfiddle.net/dDHLtR

答案 1 :(得分:-1)

据我了解你的问题。 您可以使用存储已序列化数据的'm'变量访问属性。 例如:m.isFrozen,m.seq,m.bids()&amp; m.asks()。