Javascript JSON.stringify/parse带引号的异常

Javascript JSON.stringify/parse带引号的异常,javascript,jquery,json,string,Javascript,Jquery,Json,String,我在解析一些带有引号的JSON时遇到了一个奇怪的小问题。我正在使用本机JSON.stringify和JSON.parse函数来实现这一点。如果我对一个对象进行字符串化,而该对象中有引号,那么它们将按照预期进行转义。如果我随后将其解析回一个对象,它同样可以正常工作 问题发生在我将对象字符串化,然后将对象打印到页面,然后解析结果字符串的地方。如果我尝试这样做,解析函数将失败,因为stringify只在每个有问题的引号前放了一个斜杠 我需要实现这一点的原因是,我正在开发一个应用程序,该应用程序可以动态

我在解析一些带有引号的JSON时遇到了一个奇怪的小问题。我正在使用本机JSON.stringify和JSON.parse函数来实现这一点。如果我对一个对象进行字符串化,而该对象中有引号,那么它们将按照预期进行转义。如果我随后将其解析回一个对象,它同样可以正常工作

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

我需要实现这一点的原因是,我正在开发一个应用程序,该应用程序可以动态加载存储在数据库中的JSON字符串内容。某个时刻的字符串需要打印到页面的某个地方,以便javascript能够找到它们并基于它们的内容构建页面。我需要一些方法来可靠地将对象传入和传出字符串,如果用户输入错误的字符,这些方法不会失败

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

我将两个JSFIDLE放在一起,以说明我试图描述的内容:

(Stringify然后解析回)

(字符串化,然后打印,然后解析回)


提前感谢您的帮助

这是一个问题,因为重新计算字符串时没有首先将其转换回字符串文字,因此即使它仍然有效,其含义也会发生变化。
你需要考虑什么是“代码>”\“代码>作为一个文字实际上是什么意思?答案是<代码> <代码>,没有<代码> \/COD>。为什么?

  • \”
    解析为
如果希望将
\“
作为文本的结果,则需要编写
“\\\”

  • \
    解析为
    \
  • \”
    解析为
因此,基本上,需要额外的斜杠来转义字符串文本中具有特殊含义的任何字符

如果您执行了
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"

如果使用PHP代码生成JS,则应转义JSON字符串中的引号:

//PHP code generating js code
echo "var myJSONString = \"". str_replace("\"","\\\"",$mySqlJSON)."\";";

我认为
replace()。为什么要这样做而不是使用
字符串
变量?据我所知,浏览器中的输出以浏览器认为合适的方式显示,甚至可能在代码中无效(但不是100%)。例如,当您执行
JSON.parse(字符串)时,可以工作,然后执行
console.log(reOb)
您还可以看到新的输出是:
对象{number1:“Number”1“,number2:“Number 2”,number3:“Number 3”}
,由于在
“Number”1“
中重复引用,它甚至不会在代码中解析。我不理解这个问题。为什么要再次手动键入字符串?补充一句,这个问题有点让人困惑。在示例中,您不是手动创建字符串,而是从JavaScript对象开始,因此问题很奇怪,因为您可以继续使用变量。如果你从其他地方自动或手动生成的字符串无法解析,那么你需要确保生成字符串的内容生成了有效的格式。在我正在开发的应用程序中,JSON字符串取自mySQL数据库,然后通过PHP打印到页面上。然后,页面上的javascript会提取并处理这些内容。据我所知,这阻止了我使用字符串本身,因为在某些情况下,它必须打印到页面上,以便从PHP字符串跳转到JS对象?嗨,Paul,我意识到它们是必需的,并且了解它们的功能,我想我是在问是否有办法将字符串化以输出预先转义的字符串,或者至少是一个字符串,在解析之前我不需要用replace()或类似的方法重新处理它?内存中的字符串不需要任何更改就可以在
JSON中正常工作。parse
,它是生成的字符串,在重新计算它之前,您没有将其转换为字符串文字,它需要任何反斜杠、引号,新行etc转义为转换回文本。@Gruffy如果稍后使用getJSON或$获取字符串,则将该字符串保存在数据库中。get则只在JS将其字符串化时提供JSON。如果用PHP生成JS代码,那么它会变得更复杂。@PaulS。那么,有没有一种方法可以(动态地)将其转换为字符串文本,而无需通过replace()调用对其进行迭代以保留所需的斜杠呢?@Gruffy更新了答案,其中包括两种方法使其正常工作;一个是直接获取
html
的值,另一个是创建文本的函数(是的,依赖于
replace
)。感谢您提供基于PHP的解决方案,但我希望通过JS实现这一点,以适应应用程序的构建/交付方式@格鲁菲:这件怎么样?您提到了在数据库中保存JSON字符串,但没有提到如何为其提供服务。如果您将保存的JSON作为JS提供,或者无法生成Paul提到的有效JS(您将得到一个语法错误),则必须以这种方式转义JSON字符串。@Gruffy如果以后您描述将JSON作为JSON提供,并使用$.get或$.getJSOn从页面请求它,则您会遇到麻烦,因为您的数据库中填充了无效的JSON(您通过Paul提供的JS替换方法使其无效)。
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"
//PHP code generating js code
echo "var myJSONString = \"". str_replace("\"","\\\"",$mySqlJSON)."\";";