转换JSON字符串时“无效的json-primitive”

时间:2016-03-31 08:26:26

标签: json powershell

我看过很多有这个错误的帖子,但没有任何帮助我。 所以这是我的情况:

json是由jquery创建的,如下所示:

json_zug_grp = [];
$('#bx_zuggrp:checked').each(function() {
    var name = $(this).attr("name");
    var value = $(this).val();
    item = {}
    item ["name"] = name;
    item ["value"] = value;
    json_zug_grp.push(item);
});

在此之后,我对php脚本进行ajax调用,其中包含:

$.ajax({
      url: 'psexec.php',
      type: "POST",
      cache: false,
      async: false,
      data:{    
          zug_grps:JSON.stringify(json_zug_grp)
     },
     success: function(text){
         console.log(JSON.stringify(json_zug_grp));
    }   
}); 

console.log为我提供输出WITH引号。

 [{"name":"USB_R","value":"CN=USB_R,OU=ZuGrp,OU=SecGrp,DC=DOMAIN,DC=loc"},{"name":"DVD_R","value":"CN=DVD_R,OU=ZuGrp,OU=SecGrp,DC=DOMAIN,DC=loc"}]

最后,php脚本使用json字符串作为参数从ps脚本创建一个shell_exec:

$zug_grps = $_POST["zug_grps"];
$para = " -zug_grps '".$zug_grps."'";
$psPath = "powershell.exe";
$psDIR = "C:\\path\\to\\scriptfolder\\";
$psScript = "script.ps1";
$runScript = $psDIR. $psScript;
$runCMD = $psPath." ".$runScript." ".$para; 
$output = shell_exec($runCMD);
echo $output;

此回显也为json-string提供了引号。

script.ps1如下所示:

 param(  
        [string]$zug_grps
    )

`Write-Host $zug_grps`

输出如下:

[{name:USB_R,value:CN=USB_R,OU=ZuGrp,OU=SecGrp,DC=DOMAIN,DC=loc},{name:DVD_R,value:CN=DVD_R,OU=ZuGrp,OU=SecGrp,DC=DOMAIN,DC=loc}]

不知道为什么ps中的引号被消除了。

现在,如果我像这样转换字符串:

$parsed = $zug_grps | Out-String | ConvertFrom-Json

我收到以下错误:

  

ConvertFrom-Json:无效的JSON原语:USB_R。

任何想法,出了什么问题?

1 个答案:

答案 0 :(得分:1)

JSON中的字符串必须是双引号,因此数据必须与您首次发布的内容类似:

[{"name":"USB_R","value":"CN=USB_R,OU=ZuGrp,OU=SecGrp,DC=DOMAIN,DC=loc"},{"name":"DVD_R","value":"CN=DVD_R,OU=ZuGrp,OU=SecGrp,DC=DOMAIN,DC=loc"}]

编辑:显然,PHP使用JSON字符串¹做了时髦的事情,所以在这样的单引号之间放一个带双引号的字符串不起作用:

$para = " -zug_grps '".$zug_grps."'";

转义JSON字符串中的双引号并将转义字符串放在双引号之间似乎有效:

$para = ' -zug_grps "'.addslashes($zug_grps).'"';

¹FTR:我有点不高兴。