2016-11-18 4 views
4

Как я могу прочитать этот файл «file.json»:чтения 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 

У НПХ некоторый пакет, чтобы решить этот вопрос?

ответ

1

идеальным пакетом для этой проблемы является 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

пакета вы ищете называется стрип-JSON-комментарий - https://github.com/sindresorhus/strip-json-comments

const json = '{/*rainbows*/"unicorn":"cake"}'; 

JSON.parse(stripJsonComments(json)); //=> {unicorn: 'cake'} 
+0

Но в этом пакете я могу определить мой собственный комментарий, как #? –

+0

Посмотрите, как этот пакет имеет дело с регулярными комментариями, и он должен дать вам представление о пользовательских комментариях. – Kalman

+0

Я подал вопрос! https://github.com/sindresorhus/strip-json-comments/issues/31 для создателя исправить это решение в плагине. –

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); 
}); 
+0

Да, это работает, но я скорректировал регулярное выражение на: /#.*/, потому что если есть только один #, он не работает. Благодаря! –

+1

@ HemãVidal обновил регулярное выражение с помощью '+' до '*' – peteb

 Смежные вопросы

  • Нет связанных вопросов^_^