JSON.stringify / 解析带有引号的奇怪内容

2024-04-29

我在解析一些包含引号的 JSON 时遇到了一个奇怪的小问题。我正在使用本机 JSON.stringify 和 JSON.parse 函数来执行此操作。如果我将一个对象(其中有引号的对象)字符串化,它们就会像人们所期望的那样被转义。如果我然后将其解析回一个对象,它又可以正常工作了。

问题发生在我进行字符串化,然后将对象打印到页面,然后解析结果字符串的地方。如果我尝试这样做,解析函数会失败,因为 stringify 仅在每个有问题的引号之前添加了单斜杠。

我需要实现此目标的原因是我正在开发一个应用程序,该应用程序可以动态加载以 JSON 字符串形式存储在数据库中的内容。在某些时候,需要将字符串打印到页面上的某个位置,以便 javascript 可以找到它们并根据它们的内容构建页面。我需要某种方法将对象可靠地传入和传出字符串,如果用户输入错误的字符,这种方法也不会失败!

我可以通过使用替换调用在代码中插入额外的斜杠来暂时解决这个问题,但我想知道是否有更好的方法来处理这个问题?

我整理了一些 jsfiddles 来说明我想要描述的内容:

http://jsfiddle.net/qwUAJ/ http://jsfiddle.net/qwUAJ/(字符串化然后解析回来)

var ob = {};
ob["number1"] = 'Number "1"';
ob["number2"] = 'Number 2';
ob["number3"] = 'Number 3';

var string = JSON.stringify(ob);
var reOb = JSON.parse('{"number1":"Number \"1\"","number2":"Number 2","number3":"Number 3"}');

$('div').html(string);

http://jsfiddle.net/a3gBf/4/ http://jsfiddle.net/a3gBf/4/(字符串化,然后打印,然后解析回来)

// Make an object
var ob = {};
ob["number1"] = 'Number "1"';
ob["number2"] = 'Number 2';
ob["number3"] = 'Number 3';

// Turn the object into a JSON string
var string = JSON.stringify(ob);

// Printing the string outputs
// {"number1":"Number \"1\"","number2":"Number 2","number3":"Number 3"}
$('.stringified').html(string);

// Attempt to turn the printed string back into an object
var reOb = JSON.parse('{"number1":"Number \"1\"","number2":"Number 2","number3":"Number 3"}');

// This fails due to the single escaped quote marks.

感谢您提前提供的任何帮助!


这是重新评估时出现的问题String无需先将其转换回字符串字面量,所以如果它仍然有效的话,含义就会改变。
你需要考虑什么'\"'作为字面意思实际上是什么意思?答案是",没有\. Why?

  • \"决心"

如果你想拥有\"作为文字的结果,你需要写'\\\"'

  • \\决心\
  • \"决心"

所以基本上,需要额外的斜杠来转义任何具有特殊含义的字符字符串文字.

如果你这样做了var reOb = JSON.parse($('.stringified').html());它会按原样工作得很好。


进一步考虑

str = '\\\"\\\'';      //      \"\'
str = '\"\'';          //      "'
str = '"'';            // SyntaxError: Unexpected token ILLEGAL

据我所知,JavaScript没有提供本机实现来根据需要转换字符串,因此我知道的最简单的方法是使用replace

function toLiteral(str) {
    var dict = {'\b': 'b', '\t': 't', '\n': 'n', '\v': 'v', '\f': 'f', '\r': 'r'};
    return str.replace(/([\\'"\b\t\n\v\f\r])/g, function ($0, $1) {
        return '\\' + (dict[$1] || $1);
    });
}
toLiteral('foo\\bar'); // "foo\\bar"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON.stringify / 解析带有引号的奇怪内容 的相关文章

随机推荐