【发布时间】:2016-03-21 01:00:29
【问题描述】:
某些动态 Web 框架使用此代码片段
<script>
appSettings = JSON.parse(
decodeURIComponent(
"%7B%22setting1%22%3A%22foo%22%2C%22setting2%22%3A123%7D"));
</script>
他们试图用这段代码解决一个标准的 HTML5/JavaScript 问题吗?为什么不只是
<script>
appSettings = {"setting1":"foo","setting2":123};
</script>
注意:这是动态生成的代码。我假设在服务器上他们正在做类似的事情
var settingsString = encodeURIComponent(JSON.stringify(settings));
var output = '<script>appSettings=JSON.parse(decodeURIComponent("' +
settingsString +
'"));</script>';
但它似乎也可以像这样工作
var settingsString = JSON.stringify(settings);
var output = '<script>appSettings=' +
settingsString +
';</script>';
一个想法是后者可以包含代码,但它们是提供字符串的人,它不是用户数据,所以它们不可能是代码。加上在服务器上使用JSON.stringify 将删除所有代码。即使在客户端上,JSON.parse 的 JSON.stringifyied 对象的简单 JSON.parse 也会阻止代码。
三重解析是否解决了具体问题?一次使用 JavaScript,一次使用 decodeURIComponent,一次使用 JSON.parse?
这不是一个基于意见的问题
问题是要解决什么问题。要么有问题正在解决,要么没有。回答这个问题不需要任何意见。例如,如果 JSON.stringify 有时碰巧发出无法解析的代码(据我所知,它不会,但如果有人知道得更好,那么这将是一个很好的答案)。
另请注意:我不是在问他们的框架为什么这样做。我在问标准 HTML5/JavaScript 中是否存在真正的问题正在解决。换句话说,我是否应该采用这种模式,因为如果我不这样做,我总有一天会遇到问题。
【问题讨论】:
-
我能想到为什么有人可能这样做的各种原因(虽然我能想到 (FSVO) 更好的方法来解决同样的问题),但你要求我们推测未知人的思维过程,这实际上是无法回答的。
-
@Quentin,不,我不是要你推测。要么有具体的客观原因,要么没有。这就是问题所在。它的具体客观原因是什么。解决什么问题。 AFAIK JSON 没有转义问题,因此三重解析是多余的。但我可能错了,所以这个问题。
-
您是否有理由拒绝提及执行此操作的框架?这将有助于找出原因。
-
这种编码的一个好处是如果你的 JSON 包含 HTML(例如关闭
</script>标签),浏览器会将其解释为 HTML。 -
@gman:告诉我们框架的名称可以让我们检查其来源并寻找确定的 cmets。
标签: javascript json html