【问题标题】:How to obtain detailed error when deserializing JSon反序列化JSon时如何获取详细错误
【发布时间】:2013-10-23 19:04:02
【问题描述】:

我正在使用JSon.net 库来反序列化一些对象,它工作正常:

Public Class Person
  Public Property PersonId As Long
  Public Property Name As String
  Public Property SSN As Integer
End Class

Dim json = {'Name':'John', 'SSN':'ABC'}

JsonConvert.DeserializeObject(json, GetType(Person))

但是,在我的情况下,json 可能包含无效数据(如上面的 SSN),在这种情况下,我得到的所有错误都是“输入字符串的格式不正确”。有没有办法找出究竟是哪个字段引发了错误?

【问题讨论】:

  • 您使用的是什么版本的 Json.Net?当我使用 v5.0.8(最新)尝试它时,我得到 Could not convert string to integer: ABC. Path 'SSN', line 1, position 27. 这似乎对我来说非常具体。您的 JSON 字符串格式是否正确?
  • 顺便说一下,Dim json = {'Name':'John', 'SSN':'ABC'} 不能在 VB 中编译。我假设您的意思是Dim json As String = "{'Name':'John', 'SSN':'ABC'}"。此外,从技术上讲,单引号应该是双引号才能成为正确的 JSON。见json.org
  • @BrianRogers 你对双引号是对的,在我将格式更改为双引号 JSON 后,它开始报告详细错误。
  • @BrianRogers 为什么不发表您的评论作为答案,以便我接受?
  • 很高兴听到更改引号解决了您的问题。我将其发布为您的答案。

标签: json json.net deserialization json-deserialization


【解决方案1】:

如果您的 JSON 格式正确,则 Json.Net 应在无法转换值时报告详细错误。我使用 5.0.8 版(NuGet 中的最新版本)使用以下代码进行了尝试:

Sub Main()
    Dim json As String = "{""Name"":""John"", ""SSN"":""ABC""}"
    JsonConvert.DeserializeObject(json, GetType(Person))
End Sub

Public Class Person
    Public Property PersonId As Long
    Public Property Name As String
    Public Property SSN As Integer
End Class

...我收到了一个JsonReaderException,其中包含以下消息文本:

Could not convert string to integer: ABC. Path 'SSN', line 1, position 27.

如果您收到的是 Input string was not in a correct format,这可能意味着您的 JSON 字符串有问题,导致解析器感到困惑。我在您的问题中注意到您在属性名称和值周围使用单引号而不是双引号。根据规范(请参阅JSON.org),这在技术上不是有效的 JSON,并且可能是导致问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多