php小编新一在使用JavaScript格式化JSON时可能会遇到一个常见问题,即由于数据中的双引号标志,导致出现错误。这是因为在JavaScript中,双引号用于定义字符串,所以当数据中出现双引号时,JavaScript会将其解析为字符串的结束标志,从而导致错误。为了解决这个问题,可以使用转义字符\"来转义双引号,告诉JavaScript这是一个普通的双引号而不是字符串的结束标志,从而成功格式化JSON数据。
我使用以下代码片段,在页面上清晰地显示 </code> 标记中的所有 json 字符串,其中 <code>id="jsontext"</code> 。</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">var p = document.queryselectorall("#jsontext");
var parray = [...p]
parray.foreach(p => {
var data = p.textcontent;
p.textcontent = json.stringify(json.parse(data), null, 2);
});
但是,当数据中存在双引号 (") 时,我会收到错误。
注意:json 中有问题的字段是“description”键值中的“hardcore”部分。
错误:
jquery.min.js:2 uncaught syntaxerror: expected ',' or '}' after property value in json at position 289 at json.parse (<anonymous>) at getnews:152:33 at array.foreach (<anonymous>) at htmldocument.<anonymous> (getnews:143:20) at e (jquery.min.js:2:30005) at t (jquery.min.js:2:30307) (anonymous) @ getnews:152 (anonymous) @ getnews:143 . . .
我尝试了各种正则表达式方法来纠正双引号,但这些方法导致插入不应插入转义字符的位置,或者根本不起作用。
这是 </code> 标记中的 json 文本。 (这些字段由 golang 的模板填充。)</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><pre id="jsontext">{"guid": "{{.id}}", "title": "{{.title}}", "url": "{{.url}}", "description": "{{.description}}", "sourcename": "{{.sourcename}}", "sourceurl": "{{.sourceurl}}", "imageurl": "{{.imageurl}}", "language": "{{.language}}", "location": "{{.location}}", "time": {{.time}}, "tags": "{{.tags}}", "type": {{.type}}}
我尝试了方法1:
var escapeddata = data.replace(/\"/g, "\\\""); console.log("escaped json: ", escapeddata); jsondata = json.parse(escapeddata); p.textcontent = json.stringify(jsondata, null, 2); console.log("fixed json: ", p.textcontent);
注意:json 中有问题的字段是“description”键值中的“hardcore”部分。
输入:
{ "guid": "https://www.bbc.co.uk/news/business-63648505", "title": "elon musk tells twitter staff to work long hours or leave", "url": "https://www.bbc.co.uk/news/business-63648505?at_medium=rss&at_campaign=karanga", "description": "elon musk says workers at the social media firm must be "hardcore" if they want to stay, reports say.", "sourcename": "bbc", "sourceurl": "https://www.bbc.com/news", "imageurl": "https://www.bbc.com/news/special/2015/newsspec_10857/bbc_news_logo.png?cb=1", "language": "en", "location": "uk", "time": 1668616715, "tags": "", "type": 2 }
输出:
escaped json: {\"guid\": \"https://www.bbc.co.uk/news/business-63648505\", \"title\": \"elon musk tells twitter staff to work long hours or leave\", \"url\": \"https://www.bbc.co.uk/news/business-63648505?at_medium=rss&at_campaign=karanga\", \"description\": \"elon musk says workers at the social media firm must be \"hardcore\" if they want to stay, reports say.\", \"sourcename\": \"bbc\", \"sourceurl\": \"https://www.bbc.com/news\", \"imageurl\": \"https://www.bbc.com/news/special/2015/newsspec_10857/bbc_news_logo.png?cb=1\", \"language\": \"en\", \"location\": \"uk\", \"time\": 1668616715, \"tags\": \"\", \"type\": 2}
我尝试了方法2:
var escapedData = data.replace(/"([^"]+)"/g, function(match, capture) { return '"' + capture.replace(/"/g, "\\\"") + '"'; }); jsonData = JSON.parse(escapedData); p.textContent = JSON.stringify(jsonData, null, 2); console.log("Fixed JSON: ", p.textContent);
方法 2 的输出与输入相同。
我想要的只是 json 文本看起来像这样。
预先感谢您的帮助。
由于您使用带有 handlebars 的 goland 模板,如果描述字段包含引号(如您所描述的),您的 json 格式将会失败。您的扩展字符串:
"description": "elon musk says workers at the social media firm must be "hardcore" if they want to stay, reports say.",
需要转义为:
"description": "elon musk says workers at the social media firm must be \"hardcore\" if they want to stay, reports say.",
我不熟悉 golang 的 handlebars,但假设它与常规 handlebars 兼容,您可以注册一个辅助函数来正确转义双引号,以便使用,例如:
"description": "{{{escapequotes .description}}}",
定义辅助函数来转义引号,如下所示:
Handlebars.registerHelper('escapeQuotes', function (aString) { return aString.replace(/"/g, '\\"'); });
您可以在 handlebars 游乐场上尝试一下,网址为 https://www.php.cn/link/fd92a703e837c873aca02bf1edfafcfe一个>
Atas ialah kandungan terperinci Apabila memformat JSON menggunakan JavaScript, saya mendapat ralat disebabkan oleh bendera '(petikan berganda) dalam data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!