【问题标题】:JSON parse - single quote inside nameJSON解析 - 名称内的单引号
【发布时间】:2011-12-22 04:48:05
【问题描述】:

在 Django 模板中,我打印出如下数据:

P.place = '{{place.json|safe}}';

然后在 JavaScript 文件中,我会这样处理它:

place = JSON.parse(P.place);

这样的数据一切正常:

{"category": "Cars", "name": "Z"}

因为字符串看起来像这样:

P.place = '{"category": "Cars", "name": "Z"}'

所以,我可以使用 JSON.parse 方法解析它,该方法接受字符串作为输入。

问题是当我得到这样的数据时:

{"category": "Cars", "name": "Wojtek's Z"}

因为 JSON 解析器的输入字符串看起来像这样:

'{"category": "Cars", "name": "Wojtek'

我无法在 JSON 字符串中转义单引号,因为 JSON 字符串变得无效。出于同样的原因,我不能用双引号替换周围的引号并在 JSON 字符串中转义双引号。

我的解决方案是这样的:

在 HTML 模板中:

P.place = {{place.json|safe}};

然后在 JavaScript 中

var place = JSON.stringify(P.place);
place = JSON.parse(place);

它有效,但它不是最佳解决方案恕我直言。

如何更巧妙地解决这个问题?

【问题讨论】:

  • 你必须在 JSON 中引用撇号,这是没有办法的。但通常你可以转义它,如果使用“\'”定义对象。或者,如果您愿意,可以使用 unicode 转义 \u0027(我认为)。
  • 你不能那样做,看看 jsonlint.com 和 json.org
  • 你不能做什么?查看 json 规范。
  • 您不能引用单个撇号。第 2 行的解析错误: {"ff": "f\'f"} 所以我无法用你的提议解决我的问题。

标签: javascript json


【解决方案1】:

我能想到两种可能:

创建application/json 类型的脚本元素,将模板数据注入其中,然后读取其数据,例如。

<script id="place-json" type="application/json">
  {{place.json|safe}}
</script>
<script type="application/javascript">
  P.place = $('#place-json').text();
</script>

或者,在注入字符串之前手动转义单引号,例如。

simplejson.dumps(yourdata).replace("'", r"\'")

【讨论】:

  • 感谢您的回答!但是我认为这个解决方案比我的开销更大。顺便说一句,我们不能在脚本元素中使用 id。
  • 为什么不能在脚本元素中使用id?
  • stackoverflow.com/questions/2741441/giving-the-script-tag-an-id 获取有关脚本元素中 id 的信息。此外,我怀疑两者都比字符串化然后重新解析 JSON 的开销要少,尽管您当然应该进行基准测试并查看。
  • 如果您需要您的 HTML 100% 符合规范,您可以使用我提供的第二种解决方案。 (顺便说一句,这就是我在代码中使用的解决方案)
  • 我用 div 标签包装了脚本,然后是 $('#place-json script').text();
猜你喜欢
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多