Json Parse节点

时间:2016-12-28 19:28:17

标签: json node.js powershell

我在尝试使用节点解析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 

1 个答案:

答案 0 :(得分:0)

假设您正在从文件中读取数据,一旦您拥有该字符串,您就可以使用删除功能去除#34;?"。

这样的事情:

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

修改

由于替换不起作用,请尝试1)在保存文件时不指定编码,或2)指定UTF16