我通过POST从外部服务获取xml,并在json中返回xml
这是xml的一个例子
<xml>
<item>
<user>utente1</user>
<psw>A722C63DB8EC8625AF6CF71CB8C2D939</psw>
<code>A722C63DB8EC8625AF6CF71CB8C2D939</code>
</item>
<item>
<user>utente2</user>
<psw>A722C63DB8EC8625AF6CF71CB8C2D939</psw>
<code>A722C63DB8EC8625AF6CF71CB8C2D939</code>
</item>
</xml>
并使用此过程我在json中转换xml
php
$xml = simplexml_load_string($getPostData);
$json = json_encode($xml);
json结果
{
"item": [
{
"user": "utente1",
"psw": "A722C63DB8EC8625AF6CF71CB8C2D939",
"code": "25BBDCD06C32D477F7FA1C3E4A91B032"
},
{
"user": "utente2",
"psw": "A722C63DB8EC8625AF6CF71CB8C2D939",
"code": "25BBDCD06C32D477F7FA1C3E4A91B032"
}
]
}
,这是正确的。但是当xml只有一个项目
时会出现问题 <xml>
<item>
<user>utente1</user>
<psw>A722C63DB8EC8625AF6CF71CB8C2D939</psw>
<code>A722C63DB8EC8625AF6CF71CB8C2D939</code>
</item>
</xml>
在这种情况下,json是
{
"item": {
"user": "utente1",
"psw": "A722C63DB8EC8625AF6CF71CB8C2D939",
"code": "25BBDCD06C32D477F7FA1C3E4A91B032"
}
}
在这种情况下,item是一个对象,而不是一个包含一个元素的数组。
我希望如此
{
"item": [
{
"user": "utente1",
"psw": "A722C63DB8EC8625AF6CF71CB8C2D939",
"code": "25BBDCD06C32D477F7FA1C3E4A91B032"
}
]
}
我阅读了json_encode和various json constants的文档,但我找不到强制执行此过程的选项。我继续手动控制,或者我可以自动完成? 谢谢
我的解决方案
//$getPostData = "<xml><item><user>utente1</user><psw>A722C63DB8EC8625AF6CF71CB8C2D939</psw><code>25BBDCD06C32D477F7FA1C3E4A91B032</code></item><item><user>utente1</user><psw>A722C63DB8EC8625AF6CF71CB8C2D939</psw><code>25BBDCD06C32D477F7FA1C3E4A91B032</code></item></xml>";
$getPostData = "<xml><item><user>utente1</user><psw>A722C63DB8EC8625AF6CF71CB8C2D939</psw><code>25BBDCD06C32D477F7FA1C3E4A91B032</code></item></xml>";
$xml = simplexml_load_string($getPostData);
$json = json_encode($xml);
$jsonCheck = json_decode($json);
$numItem = sizeof($jsonCheck->item);
if($numItem == 1){
$newJson = new stdClass();
$newJson->item = array();
$newJson->item[0]["user"] = $jsonCheck->item->user;
$newJson->item[0]["psw"] = $jsonCheck->item->psw;
$newJson->item[0]["code"] = $jsonCheck->item->code;
$newJson = json_encode($newJson);
echo $newJson;
}else{
echo $json;
}
答案 0 :(得分:2)
如果这是整个XML的结构而不仅仅是更大的片段的结构,你可以使用更少的代码将其转换为数组或数组和对象的混合:
$xml = simplexml_load_string($getPostData);
$array = array('item' => array());
foreach ($xml->item as $item) {
$array['item'][] = (object)(array)$item;
}
echo(json_encode($array));
无论XML中出现多少<item>
个元素,这都会产生您在问题中描述的输出。
从(object)
内的代码中删除foreach()
,以便将<item>
元素转换为数组而不是stdClass
个对象。
答案 1 :(得分:0)
我遇到了同样的问题,花了一些时间才弄清楚,但我是这样解决的。
$somearray = array();
$_SESSION['activeChatBoxes'] = array_merge($somearray, $_SESSION['activeChatBoxes']);
如果会话var activeChatBoxes仅包含一项,它将被json_encoded为Object。合并成一个空数组后,json_encode正确显示一个类似
的数组["string"]
代替:
{ 1, "string" }