簡體   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