我使用http和cordova文件readAsText函数读取了我的json文件。
http请求返回一个ok的对象。
cordova文件readAsText函数返回'字符串'其中包含额外的" r \ n \"符号。这使得无法使用JSON.parse(evt.target.result)
function readJson(absPath, success, failed){
window.resolveLocalFileSystemURL(absPath, function (entry) {
entry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function (evt) {
success(evt.target.result);
};
reader.readAsText(file);
}, failed);
}, failed);
}
readJson(cordova.file.dataDirectory + 'my.json', function(res){
console.log(JSON.parse(res)); //here I've got an parsing error due to presence of r\n\ symbols
}, failed );
如何使用cordova读取JSON文件?
更新
有趣的是,以下工作:
a = '{\r\n"a":"1",\r\n"b":"2"\r\n}';
b = JSON.parse(a);
所以这个问题不仅仅是\ r \ n ...还有一些东西是由cordova readAsText添加的
UPDATE2
作为我现在使用的解决方法var object = eval("(" + res + ")")
仍然搜索加载json对象的常用方法......
答案 0 :(得分:2)
没有人回答这个问题,我只需要为我的项目解决这个问题,所以我会发布我的解决方案。
readAsText方法输出一个字符串,因此您可以实际运行替换,但您需要做的是使用RegExp查找换行符。这是我的解决方案:
var sanitizerRegex = new RegExp(String.fromCharCode(10), 'g');
var sanitizedData = JSON.parse(result.replace(sanitizerRegex, ''));
我使用了String方法fromCharCode来获取特定的换行符和“g”标志来匹配整个字符串中的所有实例。你的字符串解决方案的问题是你不能使用反斜杠和“n”的字符进行字符串替换,因为问题是实际的新行字符,它只表示为“\ n”。
我不知道JSON.parse无法处理换行符的原因,或文件插件为什么会引入这个问题,但这个解决方案似乎对我有用。
此外,如果可以避免使用,请不要使用这样的eval,尤其是来自像JSON文件这样的源的输入。即使在cordova应用程序中,使用eval也可能非常不安全。
答案 1 :(得分:0)
我深深调试后发现了解决方案。 readAsText
函数返回的文本在文本的第一个位置还有一个字母。
示例:
{" name":" John"} => ?{"名称":" John"}(?:API没有返回?,只有一个字符串)
我用结果长度证实了这一点,所以我们需要在解析JSON之前使用substr(1)。
fileContent = fileContent.substr(1);
var jData = jQuery.parseJSON(fileContent);