我想用'{"name":"32\" TVs"}'
代替'{"name":"32\\" TVs"}'
。
'{"name":"32\" TVs"}'
是由以下人员产生的输出:
const obj = [{
"name": '32" TVs'}];
const str = JSON.stringify(obj);
console.log(str); // outputs '{"name":"32\" TVs"}' on the console.
尝试了variableName.replace(/[\"]/g, '\\"')
,但产生了'{\\"name\\":\\"32\\" TVs\\"}'
。
已建立:“ \”'被视为单个字符。
序列化和反序列化的用例:
1)。服务器端 =>
const obj = [{
"name": '32" TVs'}];
const str = JSON.stringify(obj);
console.log(str); // produces => '[{"name":"32\" TVs"}]'
并且此字符串正在传递给客户端
2)。客户端 =>
const str = '[{"name":"32\" TVs"}]';
const parsed = JSON.parse(str);// throws SyntaxError: Unexpected token T in JSON at position 14
我要序列化和反序列化的更复杂的javascript对象:
const obj = [
{
"name": "Men's Fashion"
}, {
"name": "32\" TVs",
"seourl": "store/stationery-essentials ",
},
{
"name": '32" TVs'
}
];
在这里,值中包含特殊字符(即“,”,\ t之一)。
发现:variableName.replace()将“,\”,\ t视为单个字符。
请帮助我们如何序列化和反序列化此javascript对象?
答案 0 :(得分:3)
不要使用方括号(character classes),它们会匹配方括号中任何字符的单个实例。
另外,请避免使用反斜杠:
const str = '{"name":"32\\" TVs"}'; // Escaped slash there to make sure it makes it into the actual string.
console.log("before:", str);
console.log("after:", str.replace(/\\"/g, '\\\\"'));
'\\\\"'
产生以下替换字符串:\\"
,因为它是两个带反斜杠的反斜杠(\\
)和一个"
。
总而言之,问题似乎出在您的客户端JS的生成方式上。
您说您的Jade后端生成以下JS:
const str = '[{"name":"32\" TVs"}]';
虽然这是一个字符串,但它不是有效的JSON。要声明其中包含转义引号的JS字符串,您需要转义转义字符:
const str = '[{"name":"32\\" TVs"}]';
这将导致以下JSON字符串存储在str
中:
[{"name":"32\" TVs"}]
然后可以解析哪个:
const str = '[{"name":"32\\" TVs"}]';
const obj = JSON.parse(str);
console.log(obj);
// There isn't a `\` in the `name` property:
console.log(obj[0].name === '32" TVs');
请注意,此console.log
将显示 \"
,但是\
实际上不会成为字符串的一部分。只是告诉您,这是字符串中的转义引号,而不是字符串结尾。
答案 1 :(得分:0)
尝试:
variableName.replace(/\\"/g, '\\\\"')
在您的原始尝试中,您同时放置了\
和"
一个字符类。因此,两个字符都将被替换。
答案 2 :(得分:0)
谢谢,塞布鲁斯。您帮助我找到了问题。我通过在服务器端对输入进行双重字符串化解决了这个问题。
const obj = [{
"name": '32" TVs'}];
let state = JSON.stringify(obj);
console.log(state);// outputs '{"name":"32\" TVs"}' which is the invalid string.
// We needed to escape special characters (i.e ', ", \t, \', \" etc)
// that's why need to stringify again.
state = JSON.stringify(state);
// removing first and last character of the string.
state = state.substring(1, state.length - 1);
现在状态是一个需要发送到客户端的有效字符串。