在保留引号和转义的同时创建JavaScript字典

时间:2017-11-14 01:19:40

标签: javascript json escaping

我有以下对象:

var data = {
            "parameter": []
        };

我想像这样添加一个元素,保留键上的引号以及字符串值中的转义:

data.parameter.push({
                "name": "TIBCO_Copy",
                "value": "[{\"Source_Server\":[" + tibcoCopyJobs.map(function (i) { return i.sourceServer; }).join(',') +
                                        "]},{\"Source_Path\":[" + tibcoCopyJobs.map(function (i) { return i.sourcePath; }).join(',') +
                                        "]},{\"Destination_Server\":[" + tibcoCopyJobs.map(function (i) { return i.destinationServer; }).join(',') +
                                        "]},{\"Destination_Path\":[" + tibcoCopyJobs.map(function (i) { return i.destinationPath; }).join(',') + "]}]"
            });

预期结果:

{
  "parameter": [
    {
      "name": "TIBCO_Copy",
      "value": "[{\"Source_Server\":[1s, 2s, 3s]},{\"Source_Path\":[1sp, 2sp, 3sp]},{\"Destination_Server\":[1d, 2d, 3d]},{\"Destination_Path\":[1dp, 2dp, 3dp]}]"
    }
  ]
}

在chrome检查器中看到的实际结果:

name: "TIBCO_Copy",
value: "[{"Source_Server":[1,5]},{"Source_Path":[2,6]},{"Destination_Server":[3,7]},{"Destination_Path":[4,8]}]"

请注意,它解释了嵌套键周围的转义引号以及顶级键上的常规引号。使用JSON.stringify()保留转义符,但添加了另一组引号,使其成为:

name: "TIBCO_Copy", 
value: ""[{\"Source_Server\":[1,5]},{\"Source_Path\":[2,6]…on_Server\":[3,7]},{\"Destination_Path\":[4,8]}]""

在所有这些中,我仍然会解释namevalue键的问题,因为我似乎无法逃脱它们。

我需要以这种方式对其进行格式化,因为它会通过POST给Jenkins来触发远程构建,然后通过Build over SSH插件发送到Ansible,以便用Ansible的CLI执行。因此,当数据到达目的地时,必须进行转义才能使数据格式正确。

1 个答案:

答案 0 :(得分:0)

我明白了。

除了使用JSON.stringify()之外,我只是逃避反斜杠以及转义引用。结果是\后跟",即\"。所以现在它看起来像这样:

data.parameter.push({
                "name": "TIBCO_Copy",
                "value": "[{\\\"Source_Server\\\":[" + tibcoCopyJobs.map(function (i) { return i.sourceServer; }).join(',') +
                        "]},{\\\"Source_Path\\\":[" + tibcoCopyJobs.map(function (i) { return i.sourcePath; }).join(',') +
                        "]},{\\\"Destination_Server\\\":[" + tibcoCopyJobs.map(function (i) { return i.destinationServer; }).join(',') +
                        "]},{\\\"Destination_Path\\\":[" + tibcoCopyJobs.map(function (i) { return i.destinationPath; }).join(',') + "]}]"
            });

编辑:上面是一个解决方案,用于在JS解释器解析时保留格式,并且在通过HTTP请求发送之前需要再次使用时非常有用。但是,我的数据用例发生了变化,事实证明@JoshuaK在上面原始问题的评论中大多是正确的,如果不是现场的话。基本上,我把它留下了单独逃脱的报价,而不是带有逃脱报价的逃避反斜杠。当使用$http通过AngularJS中的标准方法将其用于POST时,我能够将表单数据声明为JSON对象,如下所示:

data: 'json=' + JSON.stringify(data)

以上内容与我的关联数组(字典)对象中显示的内容完全相同,其中包含调用$http的参数。您还可以查看this其他问题,了解有关如何使用AngularJS的$http服务发布数据的详细信息。