我想我在JSON.Net中有一个错误

时间:2014-07-14 00:11:38

标签: debugging json.net

所以我有点初学者认为我有一些意想不到的行为/一个错误,虽然它可能是操作员错误而不是其他任何东西,但无论哪种方式我都难过,不知道该怎么做。

我正在读一个JSON字符串!从 https://beta-api.betfair.com/exchange/betting/rest/v1/en/navigation/lhm.json

我正在使用JSON.Net(来自Nuget的v6.0.3)传递它得到如何在分钟,但我得到一个错误,其中返回的两个所谓的唯一对象具有相同的ID,这是一个问题。在尝试解决我将其混淆的地方时,我使用Visual Studio JSON Visualiser查看了JSON字符串,并且显示了两个不同的ID。

编辑 我已经上传了两张图片,但不得不将其外部复制并复制到相关的JSON部分。

http://imgur.com/pk2hIJI,SZDSSLh

{
                                "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())

使用我自己的帮助功能

   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

结束命名空间

所以关键是我把它捣碎了吗?或者如果它是一个错误我该怎么办?

1 个答案:

答案 0 :(得分:0)

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 /名称,问题很明显。您已将id类的NavigationData字段声明为Single,而String字段应为Single27229997是浮点类型,不适合保存ID值,即使它们中可能包含小数点。

再次,仔细看看实际的JSON文件。如果您搜索“Hamilton @ Calgary”,您会看到它的ID为27229996。紧接其下方的另一个节点“Toronto @ Ottawa”的ID为27229996.0。在您的调试器映像中,值都显示为Single ID很可能被破坏,因为exchangeId无法将数字27229997完全表示为二进制浮点数,因此最近邻正在选择价值。当你需要一个精确的表示(就像你一直使用ID)时,这是一件非常糟糕的事情。

关键是要为工作使用正确的工具。您不能假设第三方ID始终为数字或仅包含一个小数点,并且您永远不会对ID执行数学运算。简而言之,没有理由将其设为十进制类型。将其声明为String,这将解决问题。出于同样的原因,我也会为{{1}}字段推荐相同内容。