PHP> json_encode,即使它只有一个元素,也强制创建一个数组

时间:2015-01-15 09:43:34

标签: php json

我通过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_encodevarious 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;
}

2 个答案:

答案 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" }