JSON анализирует неожиданный маркер с узлом

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

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

data = ?{ «stack_name»: «perf-a», «parameters»: { «StackSet»: «b», «MonitoringEnableAutoscalingAlarm»: «True», «MachineConfigEnvironment»: «Perf», «AppEnvironmentType»: «perf», «StackInRotation»: «True», «MonitoringEnableNotificationOnlyalarms»: «False», «AMIImage»: «ami-123456789» }, «теги»: { «costcenter»: «12345», «владелец»: «test@test.com»}, » cft_file»:
«cft / 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.com»}, «cft_file»: »
cft / 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(//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 = "test@test.com";
                    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 ответ

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

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

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

    РЕДАКТИРОВАТЬ

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