我想嵌入JSON的HTML。 最优雅的解决方案,我发现利用了的script
-标签和MIME媒体类型application/json
。
<script id="data" type="application/json">
{
"foo" : "bar"
}
</script>
这是嵌入JSON的标准呢? 如果不是,是否有与上述解决方案的风险?
使用内联JSON(而不是JSON-P服务)的原因:
- 少量的JSON数据的
- 少HTTP的请求
- 偏好直列JSON在HTML中的属性数据
[UPDATE]原因嵌入JSON。
我有非常高流量网站画廊部件。 画廊可以由100个图像或更多。 我只显示一个图像的时间和图像的其余部分将是懒加载。 然而,信息(图像SRC)所有图像将在页面加载的HTML渲染。 有多种方式来呈现的HTML的图像信息。 除了使用JSON我还可以使用HTML数据的属性,如下图所示:
<li class="image" data-src="image-path.jpg">
<!-- image tag will be created here using javascript -->
</li>
将导致:
<li class="image image-loaded" data-src="image-path.jpg">
<img src="image-path.jpg" />
</li>
与上述解决方案的缺点是额外的标记。 我宁愿使用JSON和JavaScript的模板引擎如doT.js 。
使用内联JSON(而不是JSON-P服务)的原因
您可以内嵌JSON-P为好。 OK,你只需要调用该方法“内联脚本”,但它既有:-)的优势
我回答我的问题,因为我已经找到解决的办法。 我的解决方案是基于什么BERGI使用内联JSONP建议。 这是从1995年起就不需要手动JSON的解析找到一个答案,我实际的问题更好的解决方案。
该JSON数据(和HTML)是用Java Server Pages(JSP)生成。
步骤1
自定义变量名称使用JSP创建。 它将被用作JavaScript的全局变量,其JSON数据将被分配到。 这个名字是随机生成的,以防止在同一页上命名冲突。
<c:set var="jsonpVarName">jsnpData<%= java.lang.Math.round(java.lang.Math.random() * 1000000) %></c:set>
步骤2该脚本标签具有cssClassname通过识别它和一个data-var
-attribute,以便自定义变量名可以被确定。 ${ctrl.json}
是JSP,并打印出JSON。 不像JSONP它采用了回调函数,使用全局变量。 到目前为止,我还没有经历过任何缺点。
<script class="data" data-var="${jsonpVarName}" type="text/javascript">
window.${jsonpVarName} = ${ctrl.json};
</script>
步骤3访问的数据(使用jQuery)是一样简单:
var data = window[$('script.data').data('var')];
例如与上下文
HTML
<div class="myWidget">
<button class="fetchData">Fetch Data</button>
<c:set var="jsonpVarName">jsnpData<%= java.lang.Math.round(java.lang.Math.random() * 1000000) %></c:set>
<script class="data" data-var="${jsonpVarName}" type="text/javascript">
window.${jsonpVarName} = ${ctrl.json};
</script>
</div>
使用Javascript
$('button.fetchData', '.myWidget').click(function (e) {
var data = window[$('script.data', '.myWidget').data('var')];
});
我使用的是直列JSONP加载它需要在页面加载JSON数据。 它不是大量的数据,它是一个HTTP请求较少。
你的建议是绝对正确的。 该type
的属性的script
标签必须是一个有效的MIME描述符。 据官方JSON RFC第6章“IANA注意事项”:
MIME媒体类型的JSON文本应用程序/ JSON。
类型名称:应用
子类型名:JSON
所以,你的HTML是有效的:
<script id="data" type="application/json">
{
"foo" : "bar"
}
</script>
而且,不,也有参与这样做没有额外的风险。
尝试http://json2html.com/这对变换JSON到HTML的好办法。