cordova readAsText返回无法解析为JSON对象的json字符串

时间:2014-11-12 13:04:33

标签: json cordova

我使用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对象的常用方法......

2 个答案:

答案 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);