在HTML中嵌入JSON是否有标准?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (167)

我想在HTML中嵌入JSON。我发现的最优雅的解决方案使用了script-tag和mime媒体类型application/json

<script id="data" type="application/json">
    {
        "foo" : "bar"
    }
</script> 

这是嵌入JSON的标准方式吗?如果不是,上述解决方案是否存在风险?

使用内联JSON(而不是JSON-P服务)的原因:

  • 少量的JSON数据
  • 减少HTTP请求
  • 内联JSON优先选择HTML属性中的数据

嵌入json的原因。

我有一个流量非常高的网站画廊部件。画廊可以包含100张或更多图片。我一次只显示一个图像,其余图像将被延迟加载。然而,所有图像的信息(图像src)将在页面加载时呈现在html中。有多种方法可以在html中呈现图像信息。我可以使用html数据属性来代替使用JSON,如下所示:

<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。好的,只需将该方法称为“内联脚本”,但它具有以下两个优点

用户回答回答于

我正在回答我自己的问题,因为我必须找到解决方案。我的解决方案基于Bergi建议使用内联JSONP的内容。这是比找到我的实际问题的答案更好的解决方案,因为不需要手动JSON解析。

JSON数据(和HTML)由Java Server Pages(JSP)生成。

步骤1

自定义变量名称是使用JSP创建的。它将用作json数据将分配给的JavaScript全局变量。该名称是随机生成的,以防止在同一页面上命名冲突。

<c:set var="jsonpVarName">jsnpData<%= java.lang.Math.round(java.lang.Math.random() * 1000000) %></c:set>    

第2步 脚本标签有一个cssClassname来标识它和一个data-var属性,以便可以确定自定义变量名称。${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请求。

扫码关注云+社区

领取腾讯云代金券