我在尝试使用节点解析JSON文件时遇到奇怪的意外令牌错误。我用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”},“tags”:{“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“},”tags“:{”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(/\\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 = "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
答案 0 :(得分:0)
假设您正在从文件中读取数据,一旦您拥有该字符串,您就可以使用删除功能去除#34;?"。
这样的事情:
s = s.replace('?','');
修改
由于替换不起作用,请尝试1)在保存文件时不指定编码,或2)指定UTF16