从 Angular/Nativescript 读取本地 JSON 文件
Reading a local JSON file from Angular/Nativescript
我试过在以下位置放置一个 en.json
文件:
src/assets/i18n/en.json
src/app/assets/i18n/en.json
然后我尝试像这样读取文件:
import {knownFolders, File} from 'tns-core-modules/file-system';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { Observable } from 'rxjs';
export class TranslateFileLoader implements TranslateLoader {
constructor(public prefix: string = 'assets/i18n/', public suffix: string = '.json') {}
public getTranslation(lang: string): Observable<Object> {
const appFolder = knownFolders.currentApp(); // Havet tried with knownFolders.documents() also
console.log(`${this.prefix}${lang}${this.suffix}`);
const cfgFile = appFolder.getFile(`${this.prefix}${lang}${this.suffix}`);
console.log(File.exists(cfgFile.path));
console.log(cfgFile.path);
const fileData = cfgFile.readTextSync();
console.log(fileData);
return JSON.parse(fileData);
}
}
console.log #1: assets/i18n/en.json
console.log #2: true
console.log #3:
/data/data/org.nativescript.playground/files/app/assets/i18n/en.json
console.log #4:
所以是的,路径看起来不错,File.exists(cfgFile.path)
returns true
,但是 fileData
是空的,因此当我 JSON.parse(fileData)
.但为什么?首先我以为文件不在那里,但我从我的存在测试中得到了真实的结果。因此,当 device/emulator 为 运行 时,文件似乎就在那里,但我无法读取其内容?
有什么想法吗?
谢谢
索伦
请分享 playground 示例,这样可以很容易地确定问题出在哪里。您甚至可以简单地将 JSON 导入为。
例如,en.ts
export const languageJSON = {
....
};
导入为
const languageJSON = require(`${this.prefix}${lang}${this.suffix}`).languageJSON;
由于路径是动态的,只需确保您的 webpack 构建能够理解它。
想想你的环境 运行 你的 JS 代码。
如果您 运行 在 node.js 下,您的代码是有意义的,它会起作用。
如果您 运行 在浏览器中,出于安全原因,本地文件系统无法访问。但是,您应该能够从服务器获取文件,并且您也许能够从本地沙箱写入和读取。
但是有这个API,看看它是否适合你:https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API
在我的项目中,我经常将本地化存储在 json 文件中,并且我成功地使用 :
获取了它们
import { HttpClient } from '@angular/common/http';
..
constructor(private http: HttpClient) {}
..
this.http.get(this.urlToFile, { responseType: 'wherever you need here text|json'}).map(res => {...});
我修好了! HttpClient 不适用于本机(是的,我的问题是本机设备上的 Nativescript,那里没有为文件提供服务的 http 服务器,是的,我确实可以访问本地存储)。我的代码有效,但 *.json 文件未传输到构建包。我必须在 "CopyWebpackPlugin" 的 tns 部分的 mt webpack.config.js 中添加那些,然后一切正常:) 我无法插入 "File.exists",因为我对“.getFile”的调用创建了一个空的文件.
我试过在以下位置放置一个 en.json
文件:
src/assets/i18n/en.json
src/app/assets/i18n/en.json
然后我尝试像这样读取文件:
import {knownFolders, File} from 'tns-core-modules/file-system';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { Observable } from 'rxjs';
export class TranslateFileLoader implements TranslateLoader {
constructor(public prefix: string = 'assets/i18n/', public suffix: string = '.json') {}
public getTranslation(lang: string): Observable<Object> {
const appFolder = knownFolders.currentApp(); // Havet tried with knownFolders.documents() also
console.log(`${this.prefix}${lang}${this.suffix}`);
const cfgFile = appFolder.getFile(`${this.prefix}${lang}${this.suffix}`);
console.log(File.exists(cfgFile.path));
console.log(cfgFile.path);
const fileData = cfgFile.readTextSync();
console.log(fileData);
return JSON.parse(fileData);
}
}
console.log #1: assets/i18n/en.json
console.log #2: true
console.log #3: /data/data/org.nativescript.playground/files/app/assets/i18n/en.json
console.log #4:
所以是的,路径看起来不错,File.exists(cfgFile.path)
returns true
,但是 fileData
是空的,因此当我 JSON.parse(fileData)
.但为什么?首先我以为文件不在那里,但我从我的存在测试中得到了真实的结果。因此,当 device/emulator 为 运行 时,文件似乎就在那里,但我无法读取其内容?
有什么想法吗?
谢谢
索伦
请分享 playground 示例,这样可以很容易地确定问题出在哪里。您甚至可以简单地将 JSON 导入为。
例如,en.ts
export const languageJSON = {
....
};
导入为
const languageJSON = require(`${this.prefix}${lang}${this.suffix}`).languageJSON;
由于路径是动态的,只需确保您的 webpack 构建能够理解它。
想想你的环境 运行 你的 JS 代码。
如果您 运行 在 node.js 下,您的代码是有意义的,它会起作用。
如果您 运行 在浏览器中,出于安全原因,本地文件系统无法访问。但是,您应该能够从服务器获取文件,并且您也许能够从本地沙箱写入和读取。
但是有这个API,看看它是否适合你:https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API
在我的项目中,我经常将本地化存储在 json 文件中,并且我成功地使用 :
获取了它们 import { HttpClient } from '@angular/common/http';
..
constructor(private http: HttpClient) {}
..
this.http.get(this.urlToFile, { responseType: 'wherever you need here text|json'}).map(res => {...});
我修好了! HttpClient 不适用于本机(是的,我的问题是本机设备上的 Nativescript,那里没有为文件提供服务的 http 服务器,是的,我确实可以访问本地存储)。我的代码有效,但 *.json 文件未传输到构建包。我必须在 "CopyWebpackPlugin" 的 tns 部分的 mt webpack.config.js 中添加那些,然后一切正常:) 我无法插入 "File.exists",因为我对“.getFile”的调用创建了一个空的文件.