2016-12-28 3 views
0

Я получаю странную неожиданную ошибку токена, пытаясь разобрать файл JSON с помощью узла. Я тестировал код с двумя файлами, которые выглядят одинаково. Я использовал инструмент сравнения кода для сравнения, и они выглядят одинаково. Однако, когда я пытаюсь их проанализировать, получается ошибка, а другая - нет. Файл, который не работает, генерируется из сценария PowerShell. Созданный вручную был создан. Я сбит с толку. Одна вещь, которую я заметил, отличается от них, когда я пишу json на консоль, тот, который не работает, имеет? в начале.Json Parse Неожиданный токен с узлом

JSON из файла, который не работает:

данных = { "stack_name": "парфюм-а", "параметры": { "StackSet": "б", "MonitoringEnableAutoscalingAlarm": " True »,« MachineConfigEnvironment »:« Perf »,« AppEnvironmentType »:« perf »,« StackInRotation »:« True »,« MonitoringEnableNotificationOnlyAlarms »:« False »,« AMIImage »:« ami-123456789 »},« теги »: { "CostCenter": "12345", "Владелец": "[email protected]"}, "cft_file": "ПФТ/cft.json"}

JSON из файла, который делает работу:

data = {"stack_name": "perf-a", "parameters": {"StackSet": "a", "MonitoringEnableAutoscalingAlarm": "True", "MachineConfigEnvironment": "Perf", "AppEnvironmentType": "perf" , «StackInRotation»: «True», «MonitoringEnableNotificationOnlyAlarms»: «False», «AMIImage»: «ami-123456789»}, «теги»: {«CostCenter»: «45229», «Владелец»: «test @ test. ком»}, "cft_file": " ПФТ/cft.json"}

код я использую для тестирования:

var envFile = "perf2.json"; 
var fs = require('fs'); 
console.log('envFile = ' + envFile); 
fs.readFile(envFile, 'utf8', function (err, data) { 
if (err) { 
    console.log('error reading variables file'); 
    throw err; 
} 
try { 

    var JsonData = JSON.stringify(data); 
    console.log('JsonData = ' + JsonData); 
    data = data.replace(/\\n/g, "\\n") 
      .replace(/\\'/g, "\\'") 
      .replace(/\\"/g, '\\"') 
      .replace(/\\&/g, "\\&") 
      .replace(/\\r/g, "\\r") 
      .replace(/\\t/g, "\\t") 
      .replace(/\\b/g, "\\b") 
      .replace(/\\f/g, "\\f") 
      .replace(/\\0/g, "") 
      .replace(/\\v/g, "") 
      .replace(/\\e/g, "\\e"); 
    data = data.replace(/[\u0000-\u001F]+/g, ""); 
    console.log('data = ' + data); 
    var cftVariables = JSON.parse(data); 
    console.log('cftVariables = ' + cftVariables); 
    console.log('cftVariables stack name = ' + cftVariables.stack_name); 
} catch (e) { 
    console.log('error parsing variables file'); 
    throw e; 
} 

}); 

Как вы можете видеть, я также пытался JSON.stringify но Я теряю свойства, а cftVariables.stack_name становится неопределенным.

Эта проблема преследует меня в течение нескольких дней, и я сейчас не понимаю, как ее исправить.

Для справки, здесь приведен фрагмент PowerShell, который создает файл. Проблема может быть там.

$savePath = "envs/" +$filetouse + ".json" 

      $parameters = @{AppEnvironmentType =$AppEnvironmentType; 
        StackSet = $StackSet; 
        StackInRotation = $StackInRotation; 
        AMIImage = $amiid; 
        MonitoringEnableAutoscalingAlarm = $MonitoringEnableAutoscalingAlarm; 
        MonitoringEnableNotificationOnlyAlarms= $MonitoringEnableNotificationOnlyAlarms; 
        MachineConfigEnvironment = $MachineConfigEnvironment; 
        } 
      $tags = @{Owner = "[email protected]"; 
        CostCenter = "45229"; 
        } 

      $envcft = @{stack_name =$stack_name; 
        cft_file = "cft/cft.json"; 
        parameters = $parameters; 
        tags = $tags; 
        } | ConvertTo-Json 
      Write-host("Saving the env file with the new amiId... ") 

      $envcft | Out-File $savePath -Encoding UTF8 -force 
+1

Вы пытались удалить '?' В начале? Это неверно json нормально .... – PaulProgrammer

ответ

0

Предполагая, что вы читаете данные из файла, как только у вас есть строка, которую вы можете использовать функцию удалить, чтобы избавиться от этого «?».

Что-то вроде этого:

s = s.replace('?',''); 

EDIT

, так как заменить не работает, попробуйте 1) либо не указав кодировку при сохранении файла, или 2) указать UTF16

+0

Я пробовал это. Фактически это не удаляло. Это почти так? На самом деле это часть строки. Это заставляет меня гать – Rhonda

+0

'?' Может быть на самом деле символом, который для вашего консольного шрифта не имеет кодировки. Лучше всего было бы отредактировать файл, а затем исправить генератор, чтобы использовать только кодировку US-ASCII или UTF-8. – PaulProgrammer

+0

@PaulProgrammer Я подозреваю, что вы можете быть прав, или "?" является спецификацией, поэтому я предлагаю не указывать кодировку, когда файл написан из сценария powershell. Согласитесь? –

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