我有这个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¤cyPair=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
以及isFrozen
和seq
值。
我在这一行收到错误:
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"}}
答案 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);
}
来正确反序列化此数据。此外,价格由于某种原因表示为字符串,它们应该是小数,如数量。这也可以在转换器中处理。
在我们进入转换器之前,让我们修复你的类定义。由于出价和要求使用相同的结构,我建议为此定义一个公共类。 JsonConverter
和price
属性都应声明为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
答案 1 :(得分:-1)
据我了解你的问题。 您可以使用存储已序列化数据的'm'变量访问属性。 例如:m.isFrozen,m.seq,m.bids()&amp; m.asks()。