序列化和反序列化javascript obj

时间:2018-08-13 06:59:05

标签: javascript regex

我想用'{"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对象?

3 个答案:

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

现在状态是一个需要发送到客户端的有效字符串。