草庐IT

javascript - JSON.parse 在有效 Json 上失败。已转义控制字符。如果

coder 2025-03-07 原文

我已经转义了控制字符,并将经过验证的 JSON 提供给 JSON.parse 和 jQuery.parseJSON。两者都给出相同的结果。

获取错误消息 “Unexpected token $”:

$(function(){
    try{
        $.parseJSON('"\\\\\"$\\\\\"#,##0"');
    } catch (exception) {
        alert(exception.message);
    }    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

感谢您查看此问题。

最佳答案

这里发生的事情是对字符串应用了两个级别的反斜杠删除。第一个是由浏览器的 JavaScript 引擎在解析单引号字符串时完成的。在 JavaScript 中,单引号字符串和双引号字符串是完全等价的(除了单引号必须在单引号字符串和双引号必须 在双引号字符串中进行反斜杠转义);两种类型的字符串都采用反斜杠转义代码,例如 \\ 用于反斜杠,\' 用于单引号(冗余但在双引号字符串中被接受),以及 \" 用于双引号(冗余但在单引号字符串中被接受)。

在您的 JavaScript 单引号字符串字面量中,您有多个此类实例,它们是有效的 JSON 双引号字符串:

"\\\\\"$\\\\\"#,##0"

浏览器解析后,该字符串恰好包含以下字符(包括外部双引号,因为它们包含在单引号字符串中所以未被删除):

"\\"$\\"#,##0"

您可以看到,每对连续的反斜杠都变成了单个文字反斜杠,并且奇数反斜杠后跟双引号的两种情况都变成了文字双引号。

That 是作为参数传递给 $.parseJSON 的文本,这是第二级反斜杠删除发生的时间。在上述文本的 JSON 解析过程中,前导双引号表示 JSON 字符串文字的开始,然后这对反斜杠被解释为单个文字反斜杠,然后紧随其后的双引号终止 JSON 字符串文字。后面的内容(美元、反斜杠、反斜杠等)是无效的 JSON 语法。

问题是您在 JavaScript 单引号字符串文字中嵌入了有效的 JSON,尽管它恰好是侥幸的有效 JavaScript 语法(如果 不会 JSON 包含单引号,或者如果您尝试使用双引号来分隔 JavaScript 字符串文字),在被浏览器的 JavaScript 引擎解析后不再包含有效的 JSON。

要解决此问题,您必须手动转义 JSON 内容以正确嵌入 JavaScript 字符串文字,或者独立于 JavaScript 源加载它,例如来自平面文件。

这里演示了如何使用最新的示例代码解决问题:

$(function() {
    try {
        alert($.parseJSON('{"key":"\\\\\\\\\\"$\\\\\\\\\\"#,##0"}').key); // works
        alert($.parseJSON('{"key":"\\\\\"$\\\\\"#,##0"}').key); // doesn't work
    } catch (exception) {
        alert(exception.message);
    }    
});

http://jsfiddle.net/814uw638/2/

由于 JavaScript 有一个简单的转义方案(例如参见 http://blogs.learnnowonline.com/2012/07/19/escape-sequences-in-string-literals-using-javascript/ ),在一般情况下实际上很容易解决这个问题。你只需要提前决定你将如何在 JavaScript 中引用字符串(单引号是个好主意,因为 JSON 中的字符串总是双引号),然后当你准备 JavaScript 源代码时,只需添加一个嵌入 JSON 中每个单引号和每个反斜杠之前的反斜杠。这应该保证它完全有效,无论确切的 JSON 内容如何(当然,前提是它是有效的 JSON)。

关于javascript - JSON.parse 在有效 Json 上失败。已转义控制字符。如果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28008852/

有关javascript - JSON.parse 在有效 Json 上失败。已转义控制字符。如果的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  7. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐