繁体   English   中英

JSON.stringify /使用引号解析奇数

[英]JSON.stringify / parse oddness with quote marks

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

我在stringify中出现问题,然后将对象打印到页面,然后解析生成的字符串。 如果我尝试这样做,解析函数将失败,因为stringify只在每个违规引号之前放置了单斜杠。

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

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

我已经整理了几个jsfiddles来说明我想要描述的内容:

http://jsfiddle.net/qwUAJ/(Stringify然后解析)

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/(Stringify ,然后打印,然后再解析)

// 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而不先将其转换回字符串文字而产生的 ,因此如果它仍然有效则意义会发生变化。
你需要考虑'\\"'作为文字实际意味着什么?答案是" ,没有\\ 为什么?

  • \\"解决到"

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

  • \\\\解析为\\
  • \\"解决到"

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

如果你做了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)."\";";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM