我如何阅读此文件' file.json':
# Comment01
# Comment02
{
"name": "MyName"
}
并检索没有评论的json?
我正在使用此代码:
var fs = require('fs');
var obj;
fs.readFile('./file.json', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
});
它会返回此错误:
SyntaxError: Unexpected token # in JSON at position 0
有 npm 一些包来解决这个问题吗?
答案 0 :(得分:4)
此问题的完美解决方案是https://www.npmjs.com/package/hjson
hjsonText输入:
# Comment01
# Comment02
{
"name": "MyName"
}
用法:
var Hjson = require('hjson');
var obj = Hjson.parse(hjsonText);
var text2 = Hjson.stringify(obj);
答案 1 :(得分:2)
您正在寻找的包名为strip-json-comments - https://github.com/sindresorhus/strip-json-comments
const json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(stripJsonComments(json)); //=> {unicorn: 'cake'}
答案 2 :(得分:2)
NPM上还有其他软件包:json-easy-strip 主要思想是仅使用单行RegExp剥离所有类型的JS样式的注释。是的,这很简单,而且很有可能!软件包更高级,具有一些文件缓存等功能,但仍然很简单。这是核心:
sweet.json
{
/*
* Sweet section
*/
"fruit": "Watermelon", // Yes, watermelons is sweet!
"dessert": /* Yummy! */ "Cheesecake",
// And finally
"drink": "Milkshake - /* strawberry */ or // chocolate!" // Mmm...
}
index.js
const fs = require('fs');
const data = (fs.readFileSync('./sweet.json')).toString();
// Striper core intelligent RegExp.
// The idea is to match data in quotes and
// group JS-type comments, which is not in
// quotes. Then return nothing if there is
// a group, else return matched data.
const json = JSON.parse(data.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => g ? "" : m));
console.log(json);
// {
// fruit: 'Watermelon',
// dessert: 'Cheesecake',
// drink: 'Milkshake - /* strawberry */ or // chocolate!'
// }
现在,因为您正在询问ShellScripting风格的注释
#
# comments
#
我们可以通过在其末尾添加\#.*
来扩展RegExp:
const json = JSON.parse(data.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/|\#.*)/g, (m, g) => g ? "" : m));
或者,如果您根本不想要JS样式的注释:
const json = JSON.parse(data.replace(/\\"|"(?:\\"|[^"])*"|(\#.*)/g, (m, g) => g ? "" : m));
答案 3 :(得分:1)
您可以非常轻松地使用自己的RegExp
来匹配以#
开头的评论
const matchHashComment = new RegExp(/(#.*)/, 'gi');
const fs = require('fs');
fs.readFile('./file.json', (err, data) => {
// replaces all hash comments & trim the resulting string
let json = data.toString('utf8').replace(matchHashComment, '').trim();
json = JSON.parse(json);
console.log(json);
});
答案 4 :(得分:-1)
Javascript内置有注释删除器,不需要额外的程序包。不过,我不会为用户输入而这么做。
eval(
'var myjsonfile=' +
require('fs')
.readFileSync('./myjsonfile.json')
.toString(),
);
console.log(myjsonfile);