【问题标题】:additional non-parsable characters are at the end of the string. c#其他不可解析的字符位于字符串的末尾。 C#
【发布时间】:2020-10-25 23:03:11
【问题描述】:

下面是我的一段代码,它在这一行中抛出了两个异常,我不知道这里有什么问题。

抛出的异常是:

  1. JsonReaderException:输入字符串“08”不是有效数字。路径“猿”,第 1 行,位置 51。
  2. FormatException:其他不可解析的字符位于字符串的末尾。

我逐行反序列化的Json如下:

{"PartitionKey": "test","RowKey": "first","Ape": 06,"Nepe": "depe","EPA": 323,"Time": "04/23/2012 18:25:43","bits": "test"}
{"PartitionKey": "test","RowKey": "Second","Ape": 107,"Nepe": "TNepe","EPA": 23,"Time": "04/22/2012 18:25:43","bits": "Ttest"}
{"PartitionKey": "test","RowKey": "Third","Ape": 08,"Nepe": "TNepe","EPA": 34,"Time": "04/20/2020 18:25:43","bits": "Jtest"}

读取前两行没有问题,但在第三/最后一行发生错误。我不确定出了什么问题,因为我确保行中或行尾没有多余的空格,并且“Ape”键是整数类型。

这是我的代码>,反序列化 Json 对象时发生错误。在屏幕截图中找到错误发生之前在行中传递的值>

foreach( var line in lines )
        {
            var data = JsonConvert.DeserializeObject<JObject>( line );
            var errors = validator.Validate( data, schema );
            
            if( errors.Count() > 0 )
            {...

如果有人知道出了什么问题并需要修复,请告诉我。谢谢

【问题讨论】:

  • 你知道这不是 json 吗?也就是说,json标准不支持前导零,你也把一堆json混在一起了。你为什么会出现这种情况?
  • 我确实意识到,格式是我期望阅读的,它不是 json,但由于我是逐行阅读,代码处理了根元素问题,你的第二个问题大约是 0,我有一行读取前导零,但下一行抛出错误,这就是我的全部问题。如果第一行有错误,则不会发布此问题。

标签: c# json .net-core


【解决方案1】:

我有一行读取前导零但抛出错误 下一行,这就是我的全部问题

如果这是一个简单的问题,Json.Net 会将其读取为八进制

八进制数字系统,或简称 oct,是以 8 为基数的数字 系统,并使用数字 0 到 7。

所以任何以 0 开头的东西都会认为是八进制

例如,它会解析03,但不会解析(并抛出错误)09

您甚至可以得到00 - 07 的正确结果。但是,如果您有 077(尽管它会解析),您将获得 323 的值,这很可能不是您想要的或您所期望的。

例子

77 = int == 77
077 = octal = 323
63 = int = 63
010 = octal = 8
8 = int = 8
9 = int = 9
08 = octal = throw
09 = octal = throw

简而言之,json 格式不正确,您可能需要从源头修复此问题。或者在解析之前修复 json

【讨论】:

  • 感谢您的解释,不过,该库似乎在解析这些值时有点混乱...我复制了代码,如果您输入 77,它将解析为 77,但如果您使用 077它将解析为 63,如果您输入 010,它将解析为 8,如果您输入 09,它会引发错误....所以,没有什么是真正有意义的,这可能会给使用这些值的人带来很多问题而无法感知立即出错
  • @ MestreDosMagros 是的,所以基本上 77 = int == 77, 077 = octal = 323, 63 = int = 63, 010 = octal = 8
  • 奇怪的是,库假设了不同的数字系统,这可能会导致不同的值,并且没有给出任何反馈,这可能会导致未来出现大错误
  • 我复制了代码,077 被假定为八进制,它实际上转换为 63 十进制*
  • @MestreDosMagros 给我一点时间,我想我有你的解决方案
【解决方案2】:

如果您将 JSON 放在此 url 上:https://jsonformatter.curiousconcept.com/# 您可以看到在您的情况下发生的错误,是从零开始的整数。
您可以在这个问题中找到更好的解释:https://stackoverflow.com/questions/27361565/why-is-json-invalid-if-an-integer-begins-with-a-leading-zero#:~:text=6%20Answers&text=A%20leading%200%20indicates%20an,would%20not%20contain%20an%208

【讨论】:

    【解决方案3】:

    我使用了这个 JSON 验证器 https://jsonformatter.curiousconcept.com
    这里似乎有两个问题:
    第一个:有 3 个根对象元素
    第二:数字不能以0开头

    我相信这是您寻求的结构:

    [{
        "PartitionKey": "test",
        "RowKey": "first",
        "Ape": 6,
        "Nepe": "depe",
        "EPA": 323,
        "Time": "04/23/2012 18:25:43",
        "bits": "test"
    }, {
        "PartitionKey": "test",
        "RowKey": "Second",
        "Ape": 107,
        "Nepe": "TNepe",
        "EPA": 23,
        "Time": "04/22/2012 18:25:43",
        "bits": "Ttest"
    }, {
        "PartitionKey": "test",
        "RowKey": "Third",
        "Ape": 8,
        "Nepe": "TNepe",
        "EPA": 34,
        "Time": "04/20/2020 18:25:43",
        "bits": "Jtest"
    }]
    

    【讨论】:

    • 被 MestreDosMagros 打败了一分钟 :-)
    • 但是如果你看到我的 json,第一行是从 0 开始的整数,这不会有任何错误
    • 我猜是因为错误是从最后一个到第一个抛出的,检查只更改最后一个整数,错误应该从下到上变成下一个
    • 我更新了我相信你希望你的结构是什么。这是一个有效的 JSON
    • 和根元素在我逐行解析时被处理..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2015-12-17
    • 2015-02-02
    • 2023-03-29
    相关资源
    最近更新 更多