【问题标题】:Why does my JSON.parse not work?为什么我的 JSON.parse 不起作用?
【发布时间】:2018-03-05 21:38:56
【问题描述】:

我在 php 中创建了一个数组对象,然后使用 json_encode 对其进行编码,然后在 javascript JSON.parse 中回显它。我收到一条错误消息“VM1770:1 Uncaught SyntaxError: Unexpected token in JSON at position 422 在 JSON.parse() 在 LabOne.php:19"

这是我的 JSON.parse 行

var JSarray = JSON.parse( '[{"name":"Carlisle Community Centre & Arena","address":"1496 Centre Road","city":" Carlisle ","phone":"905-689-7283 ","latitude":"43.3966832","longitude":"-79.9813271"},{"name":"Chedoke Twin Pad Arena","address":"91 Chedmac Dr.","city":" Hamilton ","phone":"905-546-2429 ","latitude":"43.2386207","longitude":"-79.9208443"},{"name":"Coronation Arena and Pool","address":"81 Macklin St. North","city":" Hamilton ","phone":"\t905-546-3109 \t","latitude":"43.2646431","longitude":"-79.8963275"},{"name":"Eastwood Arena","address":"111 Burlington St. East","city":" Hamilton ","phone":"\t905-546-3152 ","latitude":"43.2724438","longitude":"-79.8561951"},{"name":"Glanbrook Arena & Auditorium","address":"4300 Binbrook Road","city":" Binbrook ","phone":"\t905-692-9331 ","latitude":"43.1299662","longitude":"-79.8386732"},{"name":"Inch Park Arena & Pool","address":"400 Queensdale Ave.","city":" Hamilton ","phone":"\t905-546-4922 ","latitude":"43.2374030","longitude":"-79.8591217"},{"name":"Lawfield Arena","address":"150 Folkstone Ave.","city":" Hamilton ","phone":"905-546-4923 ","latitude":"43.2150052","longitude":"-79.8510790"},{"name":"Market Street (J.L. Grightmire) Arena","address":"35 Market St. South","city":" Dundas ","phone":"905-540-6678 ","latitude":"43.2660272","longitude":"-79.9635777"},{"name":"Mohawk 4 Ice Centre","address":"710 Mountain Brow Blvd.","city":" Hamilton \t","phone":"\t905-318-5111 ","latitude":"43.2094632","longitude":"-79.8171705"},{"name":"Morgan Firestone Arena","address":"385 Jerseyville Road West","city":" Ancaster ","phone":"\t905-546-3769 ","latitude":"43.2179937","longitude":"-80.0075459"},{"name":"Mountain (Dave Andreychuk) Arena","address":"25 Hester St.","city":" Hamilton ","phone":"\t905-546-4938 ","latitude":"43.2255668","longitude":"-79.8809353"},{"name":"North Wentworth Twin-Pad Arena","address":"27 Hwy 5","city":" Flamborough ","phone":"\t905-689-6666 \t","latitude":"43.3128542","longitude":"-79.9222993"},{"name":"Olympic Arena","address":"70 Olympic Dr.","city":" Dundas ","phone":"\t905-540-6686 ","latitude":"43.2728720","longitude":"-79.9342542"},{"name":"Parkdale (Pat Quinn) Arena and Pool","address":"1770 Main St. East","city":" Hamilton ","phone":"\t905-546-4785 ","latitude":"43.2365765","longitude":"-79.7937876"},{"name":"Rosedale Arena and Pool","address":"100 Greenhill Ave.","city":" Hamilton ","phone":"\t905-546-4805 ","latitude":"43.2215920","longitude":"-79.8144628"},{"name":"Saltfleet Arena","address":"24 Sherwood Park Road","city":" Stoney Creek ","phone":"\t905-643-3883 ","latitude":"43.2179779","longitude":"-79.7048414"},{"name":"Scott Park Arena","address":"876 Cannon St. East","city":" Hamilton ","phone":"\t905-546-4919 ","latitude":"43.2502045","longitude":"-79.8304338"},{"name":"Spring Valley Arena","address":"29 Orchard Dr.","city":" Ancaster","phone":"905-648-4404 ","latitude":"43.2169996","longitude":"-79.9981245"},{"name":"Stoney Creek Arena","address":"37 King St. West","city":" Stoney Creek ","phone":"\t905-662-2426 ","latitude":"43.2165957","longitude":"-79.7640822"},{"name":"Valley Park Arena & Rec Centre","address":"970 Paramount Dr.","city":" Stoney Creek ","phone":"905-573-3600 ","latitude":"43.1930991","longitude":"-79.7978639"}]' );

显然它在名称字段为“Coronation Area and Pool”的元素的电话字段中失败。

我用 JSONLint 检查了 json 字符串,但它说 json 字符串没问题。

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    问题是您直接在 javascript 代码中编写此 JSON 字符串,并且 escape characters 在通过 parse 方法之前被转换。

    如果它不是来自 js 字符串,而是来自例如 .json 文件,或者来自 AJAX 请求,则可以。

    但这里 \t 直接从 withing js 转换为 Tabulation(U+0009) 字符。

    为了避免这种情况,你必须

    • 在编写 js 文件时将转义字符上的反斜杠加倍 (\\t),
    • 或直接编写已解析的对象表示法,因为在 JS 脚本中将 JS 对象编写为 JSON 字符串几乎没有意义。 (var JSarray = [{name: ...)

    【讨论】:

      【解决方案2】:

      问题在于您在电话号码中使用了\t

      删除所有这些可以解决问题:

      var JSarray = JSON.parse('[{"name":"Carlisle Community Centre & Arena","address":"1496 Centre Road","city":" Carlisle ","phone":"905-689-7283 ","latitude":"43.3966832","longitude":"-79.9813271"},{"name":"Chedoke Twin Pad Arena","address":"91 Chedmac Dr.","city":" Hamilton ","phone":"905-546-2429 ","latitude":"43.2386207","longitude":"-79.9208443"},{"name":"Coronation Arena and Pool","address":"81 Macklin St. North","city":" Hamilton ","phone":"905-546-3109 ","latitude":"43.2646431","longitude":"-79.8963275"},{"name":"Eastwood Arena","address":"111 Burlington St. East","city":" Hamilton ","phone":"905-546-3152 ","latitude":"43.2724438","longitude":"-79.8561951"},{"name":"Glanbrook Arena & Auditorium","address":"4300 Binbrook Road","city":" Binbrook ","phone":"905-692-9331 ","latitude":"43.1299662","longitude":"-79.8386732"},{"name":"Inch Park Arena & Pool","address":"400 Queensdale Ave.","city":" Hamilton ","phone":"905-546-4922 ","latitude":"43.2374030","longitude":"-79.8591217"},{"name":"Lawfield Arena","address":"150 Folkstone Ave.","city":" Hamilton ","phone":"905-546-4923 ","latitude":"43.2150052","longitude":"-79.8510790"},{"name":"Market Street (J.L. Grightmire) Arena","address":"35 Market St. South","city":" Dundas ","phone":"905-540-6678 ","latitude":"43.2660272","longitude":"-79.9635777"},{"name":"Mohawk 4 Ice Centre","address":"710 Mountain Brow Blvd.","city":" Hamilton ","phone":"905-318-5111 ","latitude":"43.2094632","longitude":"-79.8171705"},{"name":"Morgan Firestone Arena","address":"385 Jerseyville Road West","city":" Ancaster ","phone":"905-546-3769 ","latitude":"43.2179937","longitude":"-80.0075459"},{"name":"Mountain (Dave Andreychuk) Arena","address":"25 Hester St.","city":" Hamilton ","phone":"905-546-4938 ","latitude":"43.2255668","longitude":"-79.8809353"},{"name":"North Wentworth Twin-Pad Arena","address":"27 Hwy 5","city":" Flamborough ","phone":"905-689-6666 ","latitude":"43.3128542","longitude":"-79.9222993"},{"name":"Olympic Arena","address":"70 Olympic Dr.","city":" Dundas ","phone":"905-540-6686 ","latitude":"43.2728720","longitude":"-79.9342542"},{"name":"Parkdale (Pat Quinn) Arena and Pool","address":"1770 Main St. East","city":" Hamilton ","phone":"905-546-4785 ","latitude":"43.2365765","longitude":"-79.7937876"},{"name":"Rosedale Arena and Pool","address":"100 Greenhill Ave.","city":" Hamilton ","phone":"905-546-4805 ","latitude":"43.2215920","longitude":"-79.8144628"},{"name":"Saltfleet Arena","address":"24 Sherwood Park Road","city":" Stoney Creek ","phone":"905-643-3883 ","latitude":"43.2179779","longitude":"-79.7048414"},{"name":"Scott Park Arena","address":"876 Cannon St. East","city":" Hamilton ","phone":"905-546-4919 ","latitude":"43.2502045","longitude":"-79.8304338"},{"name":"Spring Valley Arena","address":"29 Orchard Dr.","city":" Ancaster","phone":"905-648-4404 ","latitude":"43.2169996","longitude":"-79.9981245"},{"name":"Stoney Creek Arena","address":"37 King St. West","city":" Stoney Creek ","phone":"905-662-2426 ","latitude":"43.2165957","longitude":"-79.7640822"},{"name":"Valley Park Arena & Rec Centre","address":"970 Paramount Dr.","city":" Stoney Creek ","phone":"905-573-3600 ","latitude":"43.1930991","longitude":"-79.7978639"}]');
      console.log(JSarray);

      假设您以包含 \t 实例的格式接收 JSON,您所要做的就是使用 .replace(/\t/g, '') 删除它们。请注意,这需要解析 JSON 之前完成,因此,为了便于说明,我在以下示例中将这些步骤分开:

      var JSarray = '[{"name":"Carlisle Community Centre & Arena","address":"1496 Centre Road","city":" Carlisle ","phone":"905-689-7283 ","latitude":"43.3966832","longitude":"-79.9813271"},{"name":"Chedoke Twin Pad Arena","address":"91 Chedmac Dr.","city":" Hamilton ","phone":"905-546-2429 ","latitude":"43.2386207","longitude":"-79.9208443"},{"name":"Coronation Arena and Pool","address":"81 Macklin St. North","city":" Hamilton ","phone":"\t905-546-3109 \t","latitude":"43.2646431","longitude":"-79.8963275"},{"name":"Eastwood Arena","address":"111 Burlington St. East","city":" Hamilton ","phone":"\t905-546-3152 ","latitude":"43.2724438","longitude":"-79.8561951"},{"name":"Glanbrook Arena & Auditorium","address":"4300 Binbrook Road","city":" Binbrook ","phone":"\t905-692-9331 ","latitude":"43.1299662","longitude":"-79.8386732"},{"name":"Inch Park Arena & Pool","address":"400 Queensdale Ave.","city":" Hamilton ","phone":"\t905-546-4922 ","latitude":"43.2374030","longitude":"-79.8591217"},{"name":"Lawfield Arena","address":"150 Folkstone Ave.","city":" Hamilton ","phone":"905-546-4923 ","latitude":"43.2150052","longitude":"-79.8510790"},{"name":"Market Street (J.L. Grightmire) Arena","address":"35 Market St. South","city":" Dundas ","phone":"905-540-6678 ","latitude":"43.2660272","longitude":"-79.9635777"},{"name":"Mohawk 4 Ice Centre","address":"710 Mountain Brow Blvd.","city":" Hamilton \t","phone":"\t905-318-5111 ","latitude":"43.2094632","longitude":"-79.8171705"},{"name":"Morgan Firestone Arena","address":"385 Jerseyville Road West","city":" Ancaster ","phone":"\t905-546-3769 ","latitude":"43.2179937","longitude":"-80.0075459"},{"name":"Mountain (Dave Andreychuk) Arena","address":"25 Hester St.","city":" Hamilton ","phone":"\t905-546-4938 ","latitude":"43.2255668","longitude":"-79.8809353"},{"name":"North Wentworth Twin-Pad Arena","address":"27 Hwy 5","city":" Flamborough ","phone":"\t905-689-6666 \t","latitude":"43.3128542","longitude":"-79.9222993"},{"name":"Olympic Arena","address":"70 Olympic Dr.","city":" Dundas ","phone":"\t905-540-6686 ","latitude":"43.2728720","longitude":"-79.9342542"},{"name":"Parkdale (Pat Quinn) Arena and Pool","address":"1770 Main St. East","city":" Hamilton ","phone":"\t905-546-4785 ","latitude":"43.2365765","longitude":"-79.7937876"},{"name":"Rosedale Arena and Pool","address":"100 Greenhill Ave.","city":" Hamilton ","phone":"\t905-546-4805 ","latitude":"43.2215920","longitude":"-79.8144628"},{"name":"Saltfleet Arena","address":"24 Sherwood Park Road","city":" Stoney Creek ","phone":"\t905-643-3883 ","latitude":"43.2179779","longitude":"-79.7048414"},{"name":"Scott Park Arena","address":"876 Cannon St. East","city":" Hamilton ","phone":"\t905-546-4919 ","latitude":"43.2502045","longitude":"-79.8304338"},{"name":"Spring Valley Arena","address":"29 Orchard Dr.","city":" Ancaster","phone":"905-648-4404 ","latitude":"43.2169996","longitude":"-79.9981245"},{"name":"Stoney Creek Arena","address":"37 King St. West","city":" Stoney Creek ","phone":"\t905-662-2426 ","latitude":"43.2165957","longitude":"-79.7640822"},{"name":"Valley Park Arena & Rec Centre","address":"970 Paramount Dr.","city":" Stoney Creek ","phone":"905-573-3600 ","latitude":"43.1930991","longitude":"-79.7978639"}]';
      JSarray = JSarray.replace(/\t/g, '');
      Jsarray = JSON.parse(JSarray);
      console.log(JSarray);

      希望这会有所帮助! :)

      【讨论】:

      • 你知道 preg_replace 模式吗?我使用 '/^[\\t]+$/' 似乎不起作用
      • 你为什么要在上面运行preg_replace()?对于初学者,preg_replace() 是 PHP,当您尝试在 JavaScript 中进行解析时。您所要做的就是在 JavaScript 端运行一个替换:JSarray = JSarray.replace(/\t/g, '');。我将更新我的答案以涵盖这一点。
      • 我已经更新了我的答案以包含一个处理 JSON 的解决方案,其中包含 \t 实例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2021-08-02
      • 2015-09-25
      • 2013-04-19
      • 2015-10-17
      • 2016-02-20
      相关资源
      最近更新 更多