javascript - formBuilder 中 html 内容的 JSON Parse / Unexpected Token 错误
问题描述
谁能告诉我为什么这会导致下面的错误。JSON 解析为 OK,但似乎有些不对劲。
我知道 Chrome 错误专门指第 44 位的字母 l 是问题,但我不明白为什么会导致问题。在我看来,HTML 内容已正确转义。
仅供参考,我正在使用 formBuilder 创建一个表单,然后将 JavaScript 对象转换为 JSON 字符串,然后使用类型为 "Content-type","application/x-www-form-urlencoded" 的 POST 通过 XMLHttpRequest 发送它通过 PHP 将其存储在 MYSQL JSON 字段中,而不对 JSON 执行任何操作。从数据库中提取 JSON 并将其提供给 formBuilder 时会发生此错误。我只是在读取 MYSQL 数据,然后将其回显,自从它到达以来,它还没有被编码/解码/转义或更改。我的理解是它应该由 Ajax 帖子自动编码,并在到达时由 PHP 自动解码,因此不应该有任何挥之不去的变化。
Chrome 说: Uncaught (in promise) SyntaxError: Unexpected token l in JSON at position 43
Firefox 说 : Uncaught (in promise) SyntaxError: JSON.parse: expected ',' or '}' after property value in object at the line 1 column 44 JSON data
jQuery($ => {
var fbTemplate = document.getElementById("fb-editor");
var options = {
dataType: "json",
formData:'[{"type": "header", "label": "<span style=\"left: 491.077px; top: 101.108px; font-size: 20px; font-family: sans-serif; transform: scaleX(1.02306);\" dir=\"ltr\">ASSOCIATE MEMBERSHIP </span><span style=\"left: 754.523px; top: 101.108px; font-size: 20px; font-family: sans-serif; transform: scaleX(1.04423);\" dir=\"ltr\">APPLICATION</span>", "access": false, "subtype": "h1"}, {"name": "fname", "type": "text", "label": "First Name<br>", "access": false, "subtype": "text", "required": true, "className": "form-control"}, {"name": "sname", "type": "text", "label": "Surname", "access": false, "subtype": "text", "required": true, "className": "form-control"}, {"name": "radio-group-1621069307908", "type": "radio-group", "label": "Sex", "other": false, "access": false, "inline": false, "values": [{"label": "Male", "value": "Male", "selected": false}, {"label": "Female", "value": "Female", "selected": false}], "required": true}, {"name": "address", "type": "text", "label": "Address", "access": false, "subtype": "text", "required": true, "className": "form-control"}, {"name": "suburb", "type": "text", "label": "Suburb/Town", "access": false, "subtype": "text", "required": true, "className": "form-control"}, {"name": "postcode", "type": "text", "label": "Postcode", "access": false, "subtype": "text", "required": true, "className": "form-control"}, {"name": "state", "type": "select", "label": "State", "access": false, "values": [{"label": "VIC", "value": "VIC", "selected": true}, {"label": "NSW", "value": "NSW", "selected": false}, {"label": "QLD", "value": "QLD", "selected": false}], "multiple": false, "required": true, "className": "form-control"}, {"name": "DOB", "type": "date", "label": "DOB", "access": false, "required": true, "className": "form-control"}, {"name": "phone", "type": "text", "label": "Home Phone<br>", "access": false, "subtype": "tel", "required": false, "className": "form-control"}, {"name": "molbile", "type": "text", "label": "Mobile", "access": false, "subtype": "tel", "required": false, "className": "form-control"}, {"name": "email", "type": "text", "label": "Email", "access": false, "subtype": "email", "required": true, "className": "form-control"}]',
onSave: function() {
save();
}
};
var formBuilder = $(fbTemplate).formBuilder(options);
我正在将数据发送到 PHP,如下所示:
jsonformdata = JSON.stringify(formdata);
jsonformother = JSON.stringify(formother);
var params = 'form=' + jsonformdata + "&other=" + jsonformother;
var updateurl = '/Admin/save-form.php';
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
//console.log("array " + formdata);
console.log("Posted " + params);
console.log("Got back " + xhttp.responseText);
window.alert("Your changes were saved.");
document.getElementById('messagesresult').innerHTML="Your changes were saved";
document.getElementById('messagesresult').style.background="green";
setTimeout(function() {document.getElementById('messagesresult').innerHTML="";
document.getElementById('messagesresult').style.background="white";
}, 5000);
}
};
xhttp.open("POST", updateurl, true);
xhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhttp.send(params);
}
经过进一步测试,我发现如果我从 JSON 中删除第一个 formBuilder 项,则不再有任何错误。
表单中第一项的代码如下所示:
{"type": "header", "label": "<span style=\"left: 491.077px; top: 101.108px; font-size: 20px; font-family: sans-serif; transform: scaleX(1.02306);\" dir=\"ltr\">ASSOCIATE MEMBERSHIP </span><span style=\"left: 754.523px; top: 101.108px; font-size: 20px; font-family: sans-serif; transform: scaleX(1.04423);\" dir=\"ltr\">APPLICATION</span>", "access": false, "subtype": "h1"}
这通过了所有 JSON 验证器,它没有隐藏字符,并且据我所知是根据规范进行编码的。
解决方案
推荐阅读
- firebase - 为什么我的应用程序在 firebase 抛出异常时停止?
- vba - 如何删除变体中以 ' 开头的行?
- u-sql - U-SQL 脚本中的基本 trim() 函数出错
- bash - 如何将随机字符串插入 sed 's//' 替换字符串中的每一行?
- javascript - Javascript - 如何同步预加载图像,然后在它们全部加载后回调
- cordova - 如何在 Android Cordova 应用上启用网络请求
- c# - 如何在选择器中更改更改取消和确定按钮的颜色?
- jsp - 使用 jsp 和 scriplets 自动完成(不使用 java 类)
- c# - MSIL:为什么数组初始化器使用 dup
- c# - 仅更改 Taped Frame 的颜色