繁体   English   中英

为什么我的 JSON.parse 不起作用?

[英]Why does my JSON.parse not work?

我在 php 中创建一个数组对象,然后使用 json_encode 对其进行编码,然后在 javascript JSON.parse 中回显它。 我收到一条错误消息“VM1770:1 Uncaught SyntaxError: Unexpected token in JSON at position 422 at JSON.parse () at 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 字符串,并且转义字符在通过parse方法之前被转换。

如果它不是来自 js 字符串,而是来自.json文件或来自 AJAX 请求,那将起作用。

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

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

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

问题在于您在电话号码中使用了\\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 (JL 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 (JL 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);

希望这可以帮助! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM