【问题标题】:WinJS loading local json fileWinJS加载本地json文件
【发布时间】:2012-09-12 17:10:45
【问题描述】:

我正在努力解决这个问题。

我找不到从我的 WinJS 应用程序的子文件夹中打开简单 json 文件的方法。

我尝试过 Ajax 和 WinJS.xhr,均无济于事。

我还研究过使用 .NET 中的 File.Open 之类的“老式”方式打开文件,但除了 WinJS.Application.local.readText 之外我找不到任何东西,我尝试了绝对和一个相对路径。

我已经走到了尽头,有没有人有一个可以工作的 sn-p 可以分享?

【问题讨论】:

    标签: javascript json file windows-8 winjs


    【解决方案1】:

    您可以使用以下形式的 URL 引用应用程序包中的文件:

    ms-appx:///data/data.json
    

    (注意有三个 / 字符 - 如果你错过了第三个字符,你会遇到问题)

    要读取和解析包含 JSON 对象的文件,您可以使用 Windows.Storage 命名空间中的对象。共有三个步骤——获取指向文件的 StorageFile 对象,读取文件的内容,然后解析 JSON 数据。这是我用来执行此操作的代码:

    var url = new Windows.Foundation.Uri("ms-appx:///data/data.json");
    Windows.Storage.StorageFile.getFileFromApplicationUriAsync(url).then(function (file) {
        Windows.Storage.FileIO.readTextAsync(file).then(function (text) {
            var parsedObject = JSON.parse(text);
            // do something with object
        });
    });
    

    有很多方法可以从文件中读取数据,但我发现FileIO 对象最方便。上面的代码假定文件中有一个 JSON 对象描述。如果您的文件每行包含一个对象,那么您将需要这个:

    var url = new Windows.Foundation.Uri("ms-appx:///data/data.json");
    Windows.Storage.StorageFile.getFileFromApplicationUriAsync(url).then(function (file) {
        Windows.Storage.FileIO.readLinesAsync(file).then(function (lines) {
            lines.forEach(function (line) {
                var parsedObject = JSON.parse(line);
                // do something with object
            });
        });
    });
    

    这是一个细微的变化,它使用FileIO.readLinesAsync 方法创建一个字符串数组,每个字符串都被解析为一个 JSON 对象。

    【讨论】:

    • 谢谢,非常详细!使用 ms-appx://“协议”,这现在也适用于 jQuery。
    • 谢谢,辛苦了。只是一个风格说明,但您可能希望链接 promise 而不是嵌套它们,因此在您的代码中它们一个接一个地排列,而不是越来越深地缩进。此处示例:stackoverflow.com/questions/13709739/…
    【解决方案2】:

    如果数据是您项目的一部分,并且您已将项目类型标记为内容,则

    WinJS.xhr({ url: "data/mydata.txt" }).then(...)
    

    为我工作。在此示例中假设 mydata.txt 位于项目中名为 data 的文件夹中

    【讨论】:

    • 嗯,这很奇怪,我的文件上没有任何要更改的属性。
    • 我创建了一个具有相同扩展名的新文件并且它具有属性,然后我将它重命名(没有文件类型更改)为我以前的文件名,属性再次消失。这很奇怪。
    • WinJS.xhr({ url: "data/mydata.txt" }).then(function(response) { var content = response.responseText; /* ... */});
    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2012-05-16
    • 2017-05-08
    • 2021-05-31
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多