SOAP响应上的PHP json_encode返回数组(如果是多个),但对象是否为单个?

时间:2014-04-03 14:19:10

标签: php arrays soap json

我有一个Windows桌面小工具,对于少数用户而言,几个月前突然停止工作。似乎是他们突然不喜欢跨域请求(即使所有服务器都在我们的Intranet上)。所以,我正在重写这个东西,以便它转到我有很多控制权的单个后端服务器......并且它对后端的Ajax查询被设置为使用数据类型:jsonp。同时,小工具查询Ajax的php脚本调用SOAP服务,获取数据,将其转换为数组,然后使用json_encode将其转换为字符串并在Gadget上添加对回调函数的引用/ javascript方面。

我的问题似乎与json_encode有关。如果SOAP响应包含单个数据记录,则将其作为对象发送。如果SOAP响应包含多个记录,那么就会在它周围敲打括号,就像数组一样。

示例:

单曲:

`{
  "SmeDetail": {
    "SipAddress": "jane.smith@whatever.com",
    "SubjectExpert": "Smith,Jane",
    "SubjectMatter": "Unix"
  }
}`

多条记录:

`{
  "SmeDetail": [
    {
      "SipAddress": "fred.flintstone@whatever.com",
      "SubjectExpert": "Flintstone,Fred",
      "SubjectMatter": "Bedrock"
    },
    {
      "SipAddress": "barney.rubble@whatever.com",
      "SubjectExpert": "Rubble,Barney",
      "SubjectMatter": "Bedrock"
    },
    {
      "SipAddress": "wilma.flintstone@whatever.com",
      "SubjectExpert": "Flintsone,Wilma",
      "SubjectMatter": "Bedrock"
    }
  ]
}`

在php脚本中,典型的SOAP调用如下:

$Service_URL = 'http://server/PROD/OurWcfService/WcfService.svc?wsdl';
$client = new SoapClient($Service_URL);
$res= $client->GetSMEDetails($params)->GetSMEDetailsResult;

然后$ res被送到这个例程:

$json_data = json_encode((array)$res);
echo $_GET['callback_name'].'('.$json_data.');';

这种回声是作为Ajax响应反馈出来的。

我不确定在哪里读到有关使用这个json_encode((array)$ res)从Soap响应到数组的转换,然后是json编码的字符串。但我想知道我在这里做错了什么?我想我需要确保将单个记录作为数组推送出来。我宁愿修正“正确的方式”,而不是对字符串进行某种破解。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为问题发生的原因是GetSMEDetailsResult返回的不是数组(singlerecord)而是singlerecord本身。

检查" SmeDetail关联"?

提示:How to check if PHP array is associative or sequential?

function isAssoc($arr)
{
    return array_keys($arr) !== range(0, count($arr) - 1);
}

if(isAssoc($res['SmeDetail'])) $res['SmeDetail'] = array($res['SmeDetail']);

这个解决方案很难看,但应该可行。 另一种方法是检查"是SipAddress set":

if(isset($res['SmeDetail']['SipAddress'])) $res['SmeDetail'] = array($res['SmeDetail']);