SOAP响应上的PHP json_encode返回数组(如果多个),但返回对象(如果单个)?
我有一个Windows桌面小工具,对我的一小部分用户来说,几个月前它突然停止工作了。似乎他们突然不喜欢跨域请求(即使所有服务器都在我们的内部网上)。所以,我正在重写它,这样它就可以进入一个后端服务器,我可以对它进行很多控制。。。它对后端的Ajax查询被设置为使用数据类型:jsonp。与此同时,gadget查询la Ajax的php脚本调用SOAP服务,获取数据,将其转换为数组,然后使用json_encode将其转换为字符串,并在gadget/javascript端添加对回调函数的引用 我的问题似乎是json_编码。如果SOAP响应包含单个数据记录,则它将其作为对象发送。如果SOAP响应包含多个记录,则它会像数组一样将其括起来 示例: 单一记录:SOAP响应上的PHP json_encode返回数组(如果多个),但返回对象(如果单个)?,php,arrays,soap,json,Php,Arrays,Soap,Json,我有一个Windows桌面小工具,对我的一小部分用户来说,几个月前它突然停止工作了。似乎他们突然不喜欢跨域请求(即使所有服务器都在我们的内部网上)。所以,我正在重写它,这样它就可以进入一个后端服务器,我可以对它进行很多控制。。。它对后端的Ajax查询被设置为使用数据类型:jsonp。与此同时,gadget查询la Ajax的php脚本调用SOAP服务,获取数据,将其转换为数组,然后使用json_encode将其转换为字符串,并在gadget/javascript端添加对回调函数的引用 我的问题似
`{
"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编码的字符串。但我想知道我是不是做错了什么?我想我需要确保将单个记录作为一个数组进行推送。我宁愿用“正确的方法”来解决这个问题,也不愿对字符串进行某种破解
有什么想法吗?我认为出现问题的原因是GetSMEDetailsResult返回的不是数组(singlerecord),而是singlerecord本身 检查“是否关联”怎么样 提示: 这个解决方案很难看,但应该有效。 另一种方法是检查“是否设置了SipAddress”:
对于未来的读者:我在PHP脚本中加入了一些调试,并发现。。。的确原始的$res值是一个stdClass对象“smetail”,包含一个由各个字段组成的stdClass对象。。。当$res返回单个“记录”时。但是,当$res返回多个记录时,它返回一个stdClass对象“smetail”,其中包含一个stdClass对象数组,每个记录一个。因此,似乎SOAP客户端将XML处理成了问题所在的对象。顺便说一下,我的PHP版本是5.4.14。
function isAssoc($arr)
{
return array_keys($arr) !== range(0, count($arr) - 1);
}
if(isAssoc($res['SmeDetail'])) $res['SmeDetail'] = array($res['SmeDetail']);
if(isset($res['SmeDetail']['SipAddress'])) $res['SmeDetail'] = array($res['SmeDetail']);