所以我有点初学者认为我有一些意想不到的行为/bug,虽然它可能是操作符错误而不是其他任何东西,但无论哪种方式我都被难住了,不知道该怎么做。
我正在读取JSON字符串!从https://beta-api.betfair.com/exchange/betting/rest/v1/en/navigation/lhm.json
我传递它与JSON.Net(v6.0.3从Nuget)将得到如何在分钟内,但我得到一个错误,其中两个所谓的唯一对象返回具有相同的ID,一个问题的东西。在试图找出我把它捣碎的地方时,我用Visual Studio JSON Visualiser查看了JSON字符串,这显示了两个不同的ID。
编辑我上传了两张图片,但不得不在外部添加它,并在JSON的相关部分复制。
https://i.stack.imgur.com/G333M.jpg{
"children": [
{
"children": [
{
"exchangeId": "1",
"id": "1.114548892",
"name": "Moneyline",
"type": "MARKET"
}
],
"id": "27229997",
"name": "Hamilton @ Calgary",
"type": "EVENT"
},
{
"children": [
{
"exchangeId": "1",
"id": "1.114548889",
"name": "Moneyline",
"type": "MARKET"
}
],
"id": "27229996",
"name": "Toronto @ Ottawa",
"type": "EVENT"
}
],
"id": "74587734296",
"name": "Games 18 July",
"type": "GROUP"
},
获取字符串,我使用从HTTPclient继承的对象,与
BFresponce = Await Me.GetAsync(BetFairBetaAddress & RestAddress & Method)
Dim x = Await BFresponce.Content.ReadAsStringAsync 'not normaly here just so i can veiw the string
Return JsonConvertHelper.DeserializeObject(Of T)(Await BFresponce.Content.ReadAsStreamAsync())
With my own help function
Public Shared Function DeserializeObject(Of T)(stream As Stream) As T
Dim serializer As New JsonSerializer()
Using streamReader As New StreamReader(stream)
Return serializer.Deserialize(streamReader, GetType(T))
End Using
End Function
在T中传递的类是
Namespace BetFairNS
Public Class NavigationData
Public Property name As String
Public Property id As Single
Public Property exchangeId As Integer
Public Property type As NavigationDataType
Public Property children As List(Of NavigationData)
End Class
Public Enum NavigationDataType
EVENT_TYPE
GROUP
[EVENT]
MARKET
RACE
End Enum
结束名称空间
所以关键是我把它弄混了吗?如果是bug,我该怎么办?
Json.Net没有任何问题。您链接到的JSON数据文件有260个循环id实例,它们都在Horse Racing类别中。以下是前5条:
Duplicate id found: 1.114591860
Path 1: ROOT > Horse Racing > 1600m 3yo > 1600m 3yo
Path 2: ROOT > Horse Racing > FRA > Chant (FRA) 14th Jul > 1600m 3yo
Duplicate id found: 1.114591859
Path 1: ROOT > Horse Racing > 1600m 3yo > To Be Placed
Path 2: ROOT > Horse Racing > FRA > Chant (FRA) 14th Jul > To Be Placed
Duplicate id found: 1.114591864
Path 1: ROOT > Horse Racing > 1600m 3yo > 1600m 3yo
Path 2: ROOT > Horse Racing > FRA > Chant (FRA) 14th Jul > 1600m 3yo
Duplicate id found: 1.114591863
Path 1: ROOT > Horse Racing > 1600m 3yo > To Be Placed
Path 2: ROOT > Horse Racing > FRA > Chant (FRA) 14th Jul > To Be Placed
Duplicate id found: 1.114591869
Path 1: ROOT > Horse Racing > 1600m Grp1 > 1600m Grp1
Path 2: ROOT > Horse Racing > FRA > Chant (FRA) 14th Jul > 1600m Grp1
您可以通过使用web浏览器下载文件,将其保存到磁盘,然后用文本编辑器打开它并搜索我列出的ID值来检查这一点。每个出现两次,在层次结构的不同位置。
是否在这个站点的API文档中说JSON中的所有id都是不同的?在我看来,他们只是为了方便浏览而决定在多个级别上列出相同的节点(即直接在"赛马"下列出所有比赛,并按国家/事件列出)。你可能需要改变你对数据的假设,并相应地调整你的代码。
编辑既然已经共享了给您带来麻烦的节点的实际ID/名称,那么问题就很清楚了。您已经将NavigationData
类的id
字段声明为Single
,而它应该是String
。Single
是浮点类型,不适合保存ID值,即使它们可能包含小数点。
再次,仔细查看实际的JSON文件。如果你搜索"Hamilton @ Calgary",你会看到它的ID是27229997
。另一个节点"Toronto @ Ottawa"紧随其后,其ID为27229996
。在调试器映像中,这两个值都显示为27229996.0
。很可能是因为Single
没有能力将数字27229997精确地表示为二进制浮点数,所以选择了最接近的相邻值。当您需要精确的表示(就像您总是对ID所做的那样)时,这是非常糟糕的事情。
关键是要用对工具。您不能假设第三方ID总是数字或只包含一个小数点,并且您永远不会对ID进行数学操作。简而言之,没有理由将其设为十进制类型。将其声明为String,这将解决问题。出于同样的原因,我也建议对exchangeId
字段使用相同的方法。