尝试将 json 文件直接加载到 HTML 中并通过 javascript 读取其内容

Posted

技术标签:

【中文标题】尝试将 json 文件直接加载到 HTML 中并通过 javascript 读取其内容【英文标题】:Try to load json file directly into HTML and read its contents by javascript 【发布时间】:2016-03-10 17:58:46 【问题描述】:

我在面试时不得不通过 javascript 读取一个 json 文件。

json文件差不多是这样的:

 apple: price: 1, banana: price: 2 

我有一些解决方案,例如:

    借助ajax方法阅读 修改 json 文件,如 "var json= apple: price: 1,banana: price: 2 " 并将其加载到 html 中,就像 javascript 文件一样,所以我可以将其作为全局变量读取

但是当我问面试官时,他给了我提示:

    使用这样的脚本标签将 json 文件加载到 html:

    script type="application/json" src="scripts/data.json"

    然后通过eval(json)读取你的js文件中的数据

我很困惑:我怎么能通过将数据加载为脚本标签而不进行修改来访问数据?

【问题讨论】:

那不是 JSON。运行它通过jsonlint.com 【参考方案1】:

您将需要获取 json 文件(假设您希望通过单击按钮来获取它):

$(document).ready(function()
    $("button").click(function()
        $.getJSON("your-json.js", function(result)
            $.each(result, function(i, val)
                //you can do something with your returned data.
            );
        );
    );
);

注意:不要使用 eval(),这是一种不好的做法。

【讨论】:

我相信 OP 想通过脚本标签加载 JSON 文件。 感谢您的回答。我想 $.getJSON 只是 ajax 方法之一?让我困惑的不是怎么做,而是面试官的意思,如何只通过脚本标签而不修改json文件本身来做?我完全同意 eval 是一种不好的做法...... @Henrik 他很难过面试官给了他提示,但我仍然认为这是从给定的 json 文件中获取数据的最佳和安全的方法。 @Franco - 我同意 100%。但这个问题的答案是不可能的。只有 ajax 或修改 JSON 文件(基本上将其转换为 JavaScript 文件)才有效。 如果他想使用脚本标签,唯一的选择是遍历 json 数组。 for( var key in json-array ) 。这种方法涉及使用一些 php 来读取文件: $string = file_get_contents(json-array.json');【参考方案2】:

你不能这样做:

HTML/Javascript: how to access JSON data loaded in a script tag with src set

这可能是面试官的一个诡计问题..?

使用 ajax,这是我认为唯一正确的方法。其他解决方案属于 hack 类别。

另外,正如 Franco 所说,不要使用 eval(),除非您必须支持非常旧的浏览器并且不关心安全性。请改用 JSON.parse()。它甚至被 IE8 支持。调用 eval 会评估/执行它的参数 - 所以这是试图将恶意代码注入您的站点的人的攻击媒介。

【讨论】:

感谢您的回答。我在***上阅读过类似的问题,但我没有找到与面试官所说的相似的东西,所以我发布了这个问题......我稍后可能会问他,可能他错了。【参考方案3】:

你可能对问题的细节有不好的回忆。

显然,问题的第一部分涉及Ajax(XmlHttpRequest)。

第二部分可能与 JSONP 有关,您可以在其中修改服务器输出,使其看起来更像function(<json data here>),函数名称由客户端提供给服务器(尽管这实际上是特定于实现的)。几年前,JSONP 曾经是一种常见的模式(主要是作为不支持 XHR 的浏览器的向后兼容解决方案,但也可以绕过跨域限制)。这些天可能要少得多,因为它有一些重大的安全问题。如果您想了解更多信息:https://en.wikipedia.org/wiki/JSONP

然而,JSONP 不涉及eval 的使用,但有同样类型的安全问题:任何事情都会发生。

【讨论】:

JSONP 也有内容类型application/javascript 而不是application/json。使用application/json 将停止浏览器执行它。 @Quentin,这可能是一个细节,我怀疑是否有浏览器真正关心,他们的解释可能基于他们通过<script> 标签获得的数据这一事实(他们会解释为 Javascript 无论如何Content-Type) 而不是 Content-Type 本身。 @jcaron — 他们总是关心何时是 type 属性指定它,就像在这种情况下一样。他们查看属性,认识到它不是他们可以执行的脚本语言,然后根本不费心为它发出 HTTP 请求。 @Quentin,不确定你的意思。你说的是Content-Type(我想是HTTP标头),现在你说的是type属性(我想是<script>标签)。 @jcaron — type 属性告诉浏览器期望从服务器获得什么类型的内容。 content-type HTTP 标头告诉它内容实际上是什么。它们是相同的,但它是您在答案中使用的 type 属性。

以上是关于尝试将 json 文件直接加载到 HTML 中并通过 javascript 读取其内容的主要内容,如果未能解决你的问题,请参考以下文章

DNC读取配置Json文件到类中并在程序使用

将 JSON 多行文件加载到 pyspark 数据框中

使用 ftp:/// 加载大型 json 对象的有效方法

使用 WebView 将 HTML 加载到 Cocoa 应用程序中并更改文本

如何以功能方式使用JSON填充HTML

将 HTML 加载到 Flash 中并在 ActionScript 3 中使用 PrintJob() 进行打印?