【问题标题】:cordova readAsText returns json string that can't be parsed to JSON objectcordova readAsText 返回无法解析为 JSON 对象的 json 字符串
【发布时间】:2016-11-03 15:04:54
【问题描述】:

我使用 http 和 cordova 文件 readAsText 函数读取了我的 json 文件。

http 请求返回一个没问题的对象。

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 添加的东西

更新2

作为我现在使用的解决方法var object = eval("(" + res + ")")

还在寻找加载json对象的常用方法……

【问题讨论】:

  • 如果你这样做:JSON.parse(res.replace(/\r\n|\r|\n/g, ''))
  • 我已经尝试过了,这在解析时给出了相同的“SyntaxError: Unexpected token”
  • 您找到解决方案了吗?

标签: json cordova


【解决方案1】:

没有人回答这个问题,我只需要为我的项目解决它,所以我会发布我的解决方案。

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 也可能非常不安全。

【讨论】:

  • 如果可以的话,我会投票两次。一次是使用fromCharCode() 的巧妙答案,一次是说“如果可以避免的话,永远不要使用这样的 eval,尤其是在来自源的输入时” [31415926] (stackoverflow.com/users/1913629/31415926) 将其标记为正确答案,这肯定是我见过的最好的主意。
  • 读取 json 文件后我也遇到了同样的问题,无法解析 {'name':'John'} SyntaxError: Unexcepted token
【解决方案2】:

经过深度调试,我找到了解决方案。 readAsText 函数返回的文本在文本的第一个位置多了一个字母。

例子:

{"name":"John"} => ?{"name":"John"} (?: API 没有返回 ?,只有一个字符串)

我用结果的长度确认了这一点,所以我们需要在解析 JSON 之前使用 substr(1)。

fileContent = fileContent.substr(1);
var jData = jQuery.parseJSON(fileContent);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多