【问题标题】:"Unexpected token: StartObject" when Deserializing with Json.net使用 Json.net 反序列化时出现“意外令牌:StartObject”
【发布时间】:2018-12-10 09:32:15
【问题描述】:

我有以下 C# WebClient 返回的 JSON:

"\n\n\n{\n \"resultCount\":1,\n \"results\": [\n{\"wrapperType\":\"artist\", \"artistType\":\"Artist\", \"artistName\":\"Jack Johnson\", \"artistLinkUrl\":\"http://itunes.apple.com/us/artist/jack-johnson/id909253?uo=4\", \"artistId\":909253, \"amgArtistId\":468749, \"primaryGenreName\":\"Rock\", \"primaryGenreId\":21}]\n}\n\n\n"

或者,更清楚地说:

{
   "resultCount ":1,
   "results ":[
      {
         "wrapperType ":"artist ",
         "artistType ":"Artist ",
         "artistName ":"Jack Johnson ",
         "artistLinkUrl ":"http://itunes.apple.com/us/artist/jack-johnson/id909253?uo=4 ",
         "artistId ":909253,
         "amgArtistId ":468749,
         "primaryGenreName ":"Rock ",
         "primaryGenreId ":21
      }
   ]
}

我尝试将其反序列化为一个类,如下所示:

 thejsonresult = JsonConvert.DeserializeObject<JsonResult>(WebRequest.Json);

但收到以下错误:

读取字符串时出错。意外标记:StartObject。第 7 行,位置 2。

我很迷茫,找不到任何关于此的文档。有人知道吗?

【问题讨论】:

  • 该 JSON 字符串开头/结尾处的 " 使其无效。删除这些,你就得到了一个有效的 JSON 字符串。
  • " 只是因为它是 C# 中的字符串,它不是原始 JSON 的一部分
  • 好吧,没有 " 它在 jsonlint.org 上解析得很好。所以......很奇怪。

标签: c# json json.net


【解决方案1】:

我相信问题实际上是在您尝试反序列化的类中发现的。

您拥有的包装器属性未正确反序列化。如果它是你类中的一个对象,那么它应该可以工作,但如果它是一个字符串,我猜是这样,那么 Json 反序列化器将尝试反序列化它并发现它不是一个字符串。

【讨论】:

    【解决方案2】:

    我最近使用序列化结果中的字符串遇到了相同类型的反序列化异常,“Unexpected token: StartObject”。

    似乎目标的属性声明不能与对象类型同名。在我的例子中,被反序列化的对象有一个 ZipCode 的属性,它是一个 ZipCode 类。

    最终,将属性名称更改为类名称以外的名称解决了异常。

    【讨论】:

      【解决方案3】:

      这不会在 LINQPad 中引发任何异常:

      JsonConvert.DeserializeObject<JsonResult>("\n\n\n{\n \"resultCount\":1,\n \"results\": [\n{\"wrapperType\":\"artist\", \"artistType\":\"Artist\", \"artistName\":\"Jack Johnson\", \"artistLinkUrl\":\"http://itunes.apple.com/us/artist/jack-johnson/id909253?uo=4\", \"artistId\":909253, \"amgArtistId\":468749, \"primaryGenreName\":\"Rock\", \"primaryGenreId\":21}]\n}\n\n\n")
      

      如果您得到不同的结果,您可能需要尝试不同版本的 JSON.NET 以查看是否存在错误。

      【讨论】:

      • 尝试使用 DataContractDesereializer 并且成功了,所以可能是 JSON.Net 错误。
      • @jbkkd:您使用的是 JSON.NET 的最新版本吗?如果是这样,请花点时间提交错误报告。如果没有,您应该考虑升级。
      • 使用最新版本。我确实会提交一个错误
      • James(JSON.net 的作者)关闭了这个错误,指出它不是有效的 JSON,我应该阅读文档,没有真正的解释。在此处阅读完整的错误文档:json.codeplex.com/workitem/22759
      • @jbkkd:很遗憾听到这个消息。他可能会收到大量类似的错误报告,其中 99.9% 来自使用无效 JSON 的人,所以这是他的默认回复。但是,我要重申,使用最新版本的 JSON.NET 反序列化您的 JSON 字符串完全没有困难。您能否提供重现此问题的独立示例 C# 代码?
      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 2011-09-20
      • 2011-11-22
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      相关资源
      最近更新 更多