Debugging 我想我在JSON.Net中有一个bug

Debugging 我想我在JSON.Net中有一个bug,debugging,json.net,Debugging,Json.net,所以我是一个初学者,我认为我有一些意想不到的行为/一个bug,尽管这很可能是操作员错误,而不是其他任何事情,但无论如何,我都被难住了,不知道该怎么办 我正在读一个JSON字符串!从…起 我用Nuget的JSON.Netv6.0.3传递它,我将在几分钟内了解如何传递,但我收到一个错误,返回的两个假定唯一的对象具有相同的ID,这是一个问题。在试图找出我在哪里把它拼凑起来的时候,我用VisualStudioJSON可视化工具查看了JSON字符串,它显示了两个不同的ID,正如预期的那样 编辑 我上传了

所以我是一个初学者,我认为我有一些意想不到的行为/一个bug,尽管这很可能是操作员错误,而不是其他任何事情,但无论如何,我都被难住了,不知道该怎么办

我正在读一个JSON字符串!从…起

我用Nuget的JSON.Netv6.0.3传递它,我将在几分钟内了解如何传递,但我收到一个错误,返回的两个假定唯一的对象具有相同的ID,这是一个问题。在试图找出我在哪里把它拼凑起来的时候,我用VisualStudioJSON可视化工具查看了JSON字符串,它显示了两个不同的ID,正如预期的那样

编辑 我上传了两张图片,但不得不在外部对其进行od,并在JSON的相关部分进行复制

要获取字符串,我正在使用从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())
有我自己的帮助功能

   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
通过考试的班级是

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实例,它们都属于赛马类别。以下是前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值,即使ID值中可能包含小数点

再次仔细查看实际的JSON文件。如果您搜索Hamilton@Calgary,您将看到它的ID为27229997。另一个节点Toronto@Ottawa紧挨着它,其ID为27229996。在调试器映像中,两个值都显示为27229996.0。ID很可能被损坏,因为Single无法将数字27229997精确表示为二进制浮点数,因此将选择最接近的相邻值。这是一件非常糟糕的事情,当你需要一个准确的表示,因为你总是做一个ID


关键是使用正确的工具来完成这项工作。您不能假设第三方ID始终是数字或仅包含一个小数点,并且您永远不会对ID进行数学运算。简而言之,没有理由将其设置为十进制类型。将其声明为字符串,这将解决问题。出于同样的原因,我还建议对exchangeId字段使用相同的设置。

我没有意识到这一点,我想我必须改变我的假设,但这不是我目前正在努力解决的问题。我已经上传了两张照片到一个外部主机,因为我不能在这里这样做。他们将JSON结果显示为read-in,有两个ID的27229996。我搜索了文本,该ID只出现了一次。我不会找到它,你能解释为什么27229997在精度不足时被截断为27229996.0而不是27229990吗?标记为答案。浮点精度是一个巨大的主题,我不是这方面的专家。最有可能发生的情况是27229997不能用二进制浮点精确表示,因此将选择最接近的相邻值。我建议看一看,以帮助您了解正在发生的事情。但底线是,如果您需要像对待ID一样表示精确的值,那么不要使用不总是具有精确表示的类型。
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