2015-05-10 2 views
0

Я возникли проблемы, пытаясь разобрать файл, содержащий следующий текст в нем:JSON.parse SyntaxError: Неожиданный маркер {при разборе файла с JSON

{ "type": "header", "log_level": 3, "target_port": 80, "source_port_first": 32768, "source_port_last": 61000, "max_targets": -1, "max_runtime": 0, "max_results": 0, "iface": "en0", "rate": 0, "bandwidth": 0, "cooldown_secs": 8, "senders": 7, "use_seed": 0, "seed": 0, "generator": 0, "packet_streams": 1, "probe_module": "tcp_synscan", "output_module": "json", "gw_mac": "00:00:00:00:00:00", "source_ip_first": "127.0.0.1", "source_ip_last": "127.0.0.1", "output_filename": ".\/static\/results\/80.json", "whitelist_filename": ".\/static\/whitelist.conf", "dryrun": 0, "summary": 0, "quiet": 1, "recv_ready": 0 } 
{ "type": "result", "saddr": "127.0.0.1" } 

Это выход Zmap и node.js продолжает задыхаться от всего после первой линии. Если вы удалите вторую строку из файла, ошибок нет, и программа работает нормально.

Я хочу, чтобы иметь возможность считывать данные JSON в файле и иметь возможность ссылаться на каждую клавишу и значение и распечатывать их в console.log.

Вот мой текущий код:

var fs = require('fs'); 
var filename = './80.json'; 
var bufferString; 

function ReadFile(callback) { 
    fs.readFile(filename, 'utf-8', function(err, data) { 
    bufferString = data; 
    callback(); 
    }); 
} 

function PrintLine() { 
    console.log(JSON.parse(bufferString)); 
} 

ReadFile(PrintLine) 

Реалистично, я хотел бы поставить все эти данные в базу данных, но мне нужно, чтобы решить эту проблему чтения файла правильно.

+1

Это точное содержание '80.json'? Потому что, если это так, это недействительно JSON, следовательно, ошибка http://jsonlint.com/. У вас есть доступ к этому файлу? – azium

+2

Это недопустимо JSON, потому что это _two_ JSON строки в одном файле. Вы, вероятно, можете читать их один за другим, если вы сначала разделитесь на новую строку. – CBroe

+1

Вы имеете в виду, что файл имеет несколько строк, каждый с объектом? Определите «дроссели». –

ответ

1

Как уже упоминалось, JSON является недействительным. Но вместо того, чтобы превращать JSON в файл в массив объектов, вы также можете обрабатывать каждую строку, если каждый объект находится в новой строке:

Однако имейте в виду, что, как и @jsve, тогда файл остался бы обманщиком JSON.

function PrintLine() { 
    var lines = bufferString.split('\n'), 
     tmp = [], 
     len = lines.length; 
    for(var i = 0; i < len; i++) { 
     // Check if the line isn't empty 
     if(lines[i]) tmp.push(JSON.parse(lines[i])); 
    } 
    lines = tmp; 
    console.log(lines[0], lines[1]); 
} 

ReadFile(PrintLine); 
+0

Но тогда файл технически не был бы JSON. –

+0

Ну, это правильно. Тогда файл не заслуживает расширения '.json', но я думаю, что такое может быть полезно, если файл автогенерируется. –

+1

Логика автогенерации, вероятно, должна быть изменена в этом случае ... но было бы нецелесообразно продолжать обсуждать это в комментариях :). –

1

Вы не можете иметь несколько объектов JSON в таком файле. Если вы хотите сохранить 2 объекта в формате JSON вам нужно добавить их в массив:

[ 
    { "type": "header", ..., "recv_ready": 0 }, 
    { "type": "result", "saddr": "127.0.0.1" } 
] 

Вы можете получить доступ к каждому объекту с их индексом:

var json = JSON.parse(bufferString); 
json[0]; // this is the first object (defined on the first line) 
json[1]; // this is the second object (defined on the second line) 
Смежные вопросы