简体   繁体   English

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

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

I make an array object in php then use json_encode to encode it, then echo it in javascript JSON.parse.我在 php 中创建一个数组对象,然后使用 json_encode 对其进行编码,然后在 javascript JSON.parse 中回显它。 I recive an error saying "VM1770:1 Uncaught SyntaxError: Unexpected token in JSON at position 422 at JSON.parse () at LabOne.php:19"我收到一条错误消息“VM1770:1 Uncaught SyntaxError: Unexpected token in JSON at position 422 at JSON.parse () at LabOne.php:19”

Here is my JSON.parse line这是我的 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"}]' );

Appently it fails at the phone field of the element with the name field "Coronation Area and Pool".显然,它在名称字段为“Coronation Area and Pool”的元素的电话字段中失败。

I have checked the json string with JSONLint, but it says the json string is okay.我已经用 JSONLint 检查了 json 字符串,但它说 json 字符串没问题。

The problem is that you are writing this JSON string in your javascript code directly and that escape characters get converted before they pass the parse method.问题是您直接在 javascript 代码中编写此 JSON 字符串,并且转义字符在通过parse方法之前被转换。

If it weren't from a js string, but eg from a .json file, or from an AJAX request, that would work.如果它不是来自 js 字符串,而是来自.json文件或来自 AJAX 请求,那将起作用。

But here \\t gets converted to the Tabulation (U+0009) character from withing js directly.但是这里\\t直接从 withing js 转换为Tabulation (U+0009) 字符。

To avoid this, you would have to为了避免这种情况,你必须

  • double the backslashes on your escape characters when writing your js file ( \\\\t ),编写 js 文件( \\\\t )时,将转义字符上的反斜杠加倍,
  • or to directly write the parsed object notation since it makes very little sense to write an JS object as a JSON string in a JS script.或者直接编写解析后的对象表示法,因为在 JS 脚本中将 JS 对象编写为 JSON 字符串几乎没有意义。 ( var JSarray = [{name: ... ) ( var JSarray = [{name: ... )

The problem is with your use of \\t in your phone numbers.问题在于您在电话号码中使用了\\t

Removing all of these fixes the problem:删除所有这些可以解决问题:

 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);

Assuming that you receive the JSON in a format where the \\t instances are included, all you have to do is remove them with .replace(/\\t/g, '') .假设您以包含\\t实例的格式接收 JSON,您所要做的就是使用.replace(/\\t/g, '')删除它们。 Note that this will need to be done before parsing the JSON, and as such, I've separate out the steps for ease of clarity in the following example:请注意,这需要解析 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);

Hope this helps!希望这可以帮助! :) :)

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

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