我有一个包含内容的 asset.json 文件,需要在反应本机应用程序中读取它。
我已经认为它必须手动复制到本机实现,并且我可以验证文件是否存在(并且可读:-rw-r--r--)。
由于它在那里并且我正在使用承诺来获取它,请告诉我输出何时仍然:
{"_40":0,"_65":0,"_55":null,"_72":null}
而不是文件的内容。
const path = RNFetchBlob.fs.dirs.DocumentDir + '/' + ASSET_FILENAME;
if (await RNFS.exists(path)){
console.log("BLAH EXISTS");
} else {
console.log("BLAH DOES NOT EXIST");
}
const asset_content = await RNFS.readFile(path);
console.log("local asset_content:", asset_content);
const assets = JSON.parse(asset_content);
console.log("local assets:", assets);
输出是:
[10:03:55] I | ReactNativeJS ▶︎ BLAH EXISTS
[10:03:55] I | ReactNativeJS ▶︎ 'local asset_content:', '{"_40":0,"_65":0,"_55":null,"_72":null}'
[10:03:55] I | ReactNativeJS ▶︎ 'local assets:', { _40: 0, _65: 0, _55: null, _72: null }
另一方面,如果我使用promisify
无论出于何种原因,正如一些帖子中所建议的那样,应用程序在调用承诺的文件读取时冻结。
这里是应用了更改的代码:
const path = RNFetchBlob.fs.dirs.DocumentDir + '/' + ASSET_FILENAME;
if (await RNFS.exists(path)){
console.log("BLAH EXISTS");
} else {
console.log("BLAH DOES NOT EXIST");
}
const readFileAsync = promisify(RNFS.readFile);
const asset_content = await readFileAsync(path);
console.log("local asset_content:", asset_content);
const assets = JSON.parse(asset_content);
console.log("local assets:", assets);
及其输出:
[10:24:16] I | ReactNativeJS ▶︎ BLAH EXISTS
文件不大,只有 81 行有效的 JSON。
现在,如果我使用承诺来检查是否有任何异常,如下所示:
const path = RNFetchBlob.fs.dirs.DocumentDir + '/' + ASSET_FILENAME;
if (await RNFS.exists(path)){
console.log("BLAH EXISTS");
} else {
console.log("BLAH DOES NOT EXIST");
}
const readFileAsync = promisify(RNFS.readFile);
let asset_content = null;
readFileAsync(path, 'utf8')
.then((str) => {
console.log("got result: ", str);
asset_content = str;
})
.catch((e) => {
console.log("got error:", e);
});
console.log("local asset_content:", asset_content);
const assets = JSON.parse(asset_content);
console.log("local assets:", assets);
我仍然没有异常,结果为空:
[10:45:00] I | ReactNativeJS ▶︎ BLAH EXISTS
[10:45:00] I | ReactNativeJS ▶︎ 'local asset_content:', null
[10:45:00] I | ReactNativeJS ▶︎ 'local assets:', null
当我摆脱 Promisify 并离开 Promise 处理时,我又回到了开始的地方:
const path = RNFetchBlob.fs.dirs.DocumentDir + '/' + ASSET_FILENAME;
if (await RNFS.exists(path)){
console.log("BLAH EXISTS");
} else {
console.log("BLAH DOES NOT EXIST");
}
let asset_content = null;
RNFS.readFile(path, 'utf8')
.then((str) => {
console.log("got result: ", str);
asset_content = str;
})
.catch((e) => {
console.log("got error:", e);
});
console.log("local asset_content:", asset_content);
const assets = JSON.parse(asset_content);
console.log("local assets:", assets);
output:
[10:49:45] I | ReactNativeJS ▶︎ BLAH EXISTS
[10:49:45] I | ReactNativeJS ▶︎ 'local asset_content:', null
[10:49:45] I | ReactNativeJS ▶︎ 'local assets:', null
[10:49:45] I | ReactNativeJS ▶︎ 'got result: ', '{"_40":0,"_65":0,"_55":null,"_72":null}'
请帮忙。文件处理对于我们的应用程序至关重要。
更新:
以下是 ASSET_FILE 引用的 asset.json 文件的内容:
{
"protobuf": [
{
"name": "tiny-fovapp-4c",
"lite": false,
"compressed": false,
"selected": false
},
{
"name": "tiny-yolo-4c-quantized",
"lite": true,
"compressed": true,
"selected": false
},
{
"name": "tiny-yolo-4c",
"parentFolder": "/data/user/0/com.foviar/files/",
"modelFilePath": "ai/protobuf/tiny-yolo-4c.pb",
"labelsFilePath": "ai/protobuf/tiny-yolo-4c-labels.txt",
"lite": false,
"compressed": false,
"selected": true
},
{
"name": "tiny-yolo-4c",
"lite": true,
"compressed": false,
"selected": false
}
],
"testImages": [
{
"name": "IMG_6924.jpg",
"parentFolder": "/data/user/0/com.foviar/files/",
"filePath": "ai/testimgs/IMG_6924.jpg"
},
{
"name": "IMG_6924.png",
"parentFolder": "/data/user/0/com.foviar/files/",
"filePath": "ai/testimgs/IMG_6924.png"
},
{
"name": "IMG_6929.jpg",
"parentFolder": "/data/user/0/com.foviar/files/",
"filePath": "ai/testimgs/IMG_6929.jpg"
},
{
"name": "Part1.png",
"parentFolder": "/data/user/0/com.foviar/files/",
"filePath": "ai/testimgs/Part1.png"
},
{
"name": "Part1_10.png",
"parentFolder": "/data/user/0/com.foviar/files/",
"filePath": "ai/testimgs/Part1_10.png"
}
],
"parts": [
{
"name": "Part1",
"parentFolder": "/data/user/0/com.foviar/files/",
"modelFilename": "ai/models/Part1.png",
"drawingFilename": "ai/drawings/Part1.png",
"annotationFilename": "ai/annotations/Part1.xml"
},
{
"name": "Part2",
"parentFolder": "/data/user/0/com.foviar/files/",
"modelFilename": "ai/models/Part2.png",
"drawingFilename": "ai/drawings/Part2.png",
"annotationFilename": "ai/annotations/Part2.xml"
},
{
"name": "Part3",
"parentFolder": "/data/user/0/com.foviar/files/",
"modelFilename": "ai/models/Part3.png",
"drawingFilename": "ai/drawings/Part3.png",
"annotationFilename": "ai/annotations/Part3.xml"
}
]
}