innerHTML 和静默解码的引号

innerHTML and silently decoded quotes

设置:

在页面上,隐藏的 div 中是一个格式正确的 JSON 对象。

作为这个对象的一部分,一些值是HTML,在这个HTML中,双引号是HTML编码的,像这样:"addtionalInfo": "If you need more help, please visit <a href="http://www.google.com">Google</a>"

在页面的后面,我正在尝试编写 JS 来读取这个对象,以便可以完成其他很酷的事情。

问题: innerHTML 似乎隐式解码引号,这意味着 JSON.parse() (和类似的 jQuery 选项)失败,因为语法错误。我无法替换 () 引号,因为它们以正确的 JSONy 方式无处不在。

一个例子:

<span class="hiddenField" id="TheJSONObject">


 { "thing" : "thingvalue", "badthing" : "a &lt;a href=&quot;http://www.google.com&quot;&gt;link!&lt;/a&gt;", "lastthing" : "lastthingvalue" }


</span>

<script>
var newobj = JSON.parse(document.getElementById("TheJSONObject").innerHTML.trim());
alert(newobj.thing);

来自控制台的证明(CHROME):

console.log(document.getElementById("TheJSONObject").innerHTML) 


 { "thing" : "thingvalue", "badthing" : "a &lt;a href="http://www.google.com"&gt;link!&lt;/a&gt;", "lastthing" : "lastthingvalue" }

问题: 有没有什么方法可以得到实际的原始内部 HTML 而无需 JS 试图像这样善待我,这样 JSON.parse() 就可以工作了?

那是完全不可能的。你有一个 <span>,而不是 <script> 或任何其他被视为文字文本的东西,所以 &quot;" 之间没有区别。您需要首先对其进行正确编码;这可能意味着 HTML-encoding JSON-encoded 对象包含 HTML-encoded 输出值作为 HTML.

如果您无法修改该输出,最接近的可能是发出 (XHR) 请求并在实体完好无损的情况下手动解析它。