json串转Object问题
发布于 3 天前 作者 imhered 293 次浏览 来自 问答

先上代码 test.json内容

{"id":123,"name":"name"}

test.js

var fs = require('fs');
function Test() {}
module.exports = Test;
Test.fun = function() {
    fs.readFile("./json/test.json", 'utf8', function(err, val) {
        console.log(val);//这里输出内容为{"id":123,"name":"name"}
        //JSON.parse(val);//这里直接报错 SyntaxError: Unexpected token
        var temp = '{"id":123,"name":"name"}';
        temp = JSON.parse(temp);//这里没问题
        console.log(temp.id);
    });
};

同样的json串,为什么我从文件里读出来就不能JSON.parse()了呢? eval也不行。

18 回复

typeof Val 看看类型是不是字符串

这是文件系统,文件流是个Buffer,不能用JSON.parse()解析的

val = val.toString()

@jiurihuahuo 读的时候 加了utf8参数,得到的val已经是字符串了 不是buffer

@elrrrrrrr 已经是字符串了。

@ncuzp 看了下,是字符串。

json文件可直接require

来自酷炫的 CNodeMD

@klesh 嗯,这个我知道。 但是我想不明白为什么通过fs读出来的就不能JSON.parse()了呢

@imhered

可能是符号什么的打错了,打成全角字符了。仔细检查一遍,我用你的代码没问题。

@coordcn 符号没问题,确认过了。 你 JSON.parse(val) 这个一行代码能通过?

@imhered

是不是在windows底下?如果是的话看看是不是存成utf-8带bom格式了。

是buffer不是string,输出的话可能console.log进行toString()操作 buffer属于对象当然不能JSON.parse了

@coordcn 确实是在windows下,我把第一次console.log(val)这里输出的结果直接在浏览器控制台里 JSON.pars()也报错。应该就是windows的原因了。 但是我直接把整个脚本在linux里也报错呢。

@shynome 不是buffer啊,我读的时候已经加了utf8了,而且第一个console.log(val)这里输出的已经是正确的json串了,不是buffer,看我代码注释。

@imhered 本地重试了一下ok, 那 json 文件是 utf-8 编码的吗? test.json 改成了 gbk 编码,console.log 输出正常,parse 报错 untitled1.png

@elrrrrrrr 刚测了下,文件格式是utf8就不能parse,我改成ansi读出来就能parse了,看样子是编码问题了。

@imhered

基本可以肯定是存成utf-8带bom格式了。

@coordcn 嗯,刚测了下,在第一次输出结果 { 这个前面移动了下光标,确实有东西。

回到顶部