【问题标题】:JSON.parse invalid characterJSON.parse 无效字符
【发布时间】:2013-09-16 05:14:30
【问题描述】:

我在 Breeze 1.1.2 的微风.debug.js 的第 12565 行收到无效字符错误。该行是:

var metadata = JSON.parse(data);

我研究了这条错误消息,我看到的最佳建议是未转义的单引号或双引号,或无效字符。但是,我在回复中都找不到。

我正在使用 BreezeJS 发出请求并处理响应。 Breeze.WebApi.EFContextProvider.Metadata() 正在生成响应。我在 Windows 8.1 上使用 IE11。生成响应的服务器是 IIS Express 8。我使用 Fiddler 捕获了请求和响应。

任何人都可以看到响应有什么问题吗?

请求:

GET http://localhost/RisingTide.API/breeze/scheduledpayments/Metadata HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://localhost/RisingTide.Web/#/scheduledpayments
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko
Host: localhost
DNT: 1
Connection: Keep-Alive

回复:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 862
Content-Type: application/json
Expires: -1
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sun, 15 Sep 2013 03:37:14 GMT

{"schema":{"namespace":"RisingTide.API.Models","alias":"Self","d4p1:UseStrongSpatialTypes":"false","xmlns:d4p1":"http://schemas.microsoft.com/ado/2009/02/edm/annotation","xmlns":"http://schemas.microsoft.com/ado/2009/11/edm","cSpaceOSpaceMapping":"[[\"RisingTide.API.Models.ScheduledPayment\",\"RisingTide.API.Models.ScheduledPayment\"]]","entityType":{"name":"ScheduledPayment","key":{"propertyRef":{"name":"Id"}},"property":[{"name":"Id","type":"Edm.Int32","nullable":"false","d4p1:StoreGeneratedPattern":"Identity"},{"name":"Description","type":"Edm.String","fixedLength":"false","maxLength":"4000","unicode":"true","nullable":"true"},{"name":"Amount","type":"Edm.Decimal","precision":"18","scale":"2","nullable":"false"}]},"entityContainer":{"name":"ScheduledPaymentsDbContext","entitySet":{"name":"ScheduledPayments","entityType":"Self.ScheduledPayment"}}}}

【问题讨论】:

  • 我想看看 BreezeJS 是如何实际处理响应的。我有一种预感,“数据”可能已经被 BreezeJS 解析过并且是一个 JavaScript 对象,而不是一个字符串。执行 console.log(data) 会得到什么?
  • 我第二个亚当,你能截图console.log(data)吗?如果对象键有冒号,JSON.parse 将不起作用。但是网站learn.breezejs.com 似乎很容易解析这个learn.breezejs.com/api/northwind/Employees GET 请求......
  • 亚当,naveen,你是对的,数据已经是一个对象。 Console.log(data) 给出“未定义”,而 console.log(data.schema.alias) 给出“Self”。任何想法是什么触发了这个?我猜我做了什么,比如我使用 metadataStore.registerEntityTypeCtor
  • 我查看了一些较新版本的 Breeze.debug.js,在某些时候他们将行更改为 var metadata = typeof (data) === "string" ? JSON.parse(data) : data;。我会升级。

标签: json breeze windows-8.1 internet-explorer-11


【解决方案1】:

Breeze v1.1.2 已经很老了。我们在早期版本中修复了许多类似的错误。当前最新的稳定版本是 1.4.2

【讨论】:

  • 我认为这是正确的答案,并说明我有 2 个项目 - 我的服务器项目使用的是 Breeze 1.3.6,我的客户端项目使用的是 1.1.2。我敢肯定混合没有帮助:)
【解决方案2】:

看起来 JSON.parse 被\" 绊倒了。 JSON 似乎不支持。

"[[\"RisingTide.API.Models.ScheduledPayment\",\"RisingTide.API.Models.ScheduledPayment\"]]"

引号必须是双反斜杠,如下所示:

"[[\\"RisingTide.API.Models.ScheduledPayment\\",\\"RisingTide.API.Models.ScheduledPayment\\"]]"

必须是\"在""中被当做",但是\"在""中被当做\"。

有趣。直到我试过才知道。 :-)


更新:这张 CDT 会话的屏幕截图应该有助于更好地解释发生了什么:

您可以看到,当您使用单个反斜杠时,JSON 将解析 """,这不是一个有效的 JSON 字符串。但是使用 \,JSON 将解析一个 \ 和 3 个 ",这是有效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2012-03-30
    • 2014-09-08
    相关资源
    最近更新 更多