1

我使用这个 PHP 类将 XML 转换为 JSON:http ://www.ibm.com/developerworks/library/x-xml2jsonphp/

例如对于这个 XML:

<?xml version="1.0" encoding="UTF-8"?>
<searchResult>
    <status>OK</status>
    <users>
        <user>
            <userName>johndoe</userName>
        </user>
        <user>
            <userName>johndoe1</userName>
            <fullName>John Doe</fullName>
        </user>
        <user>
            <userName>johndoe2</userName>
        </user>
        <user>
            <userName>johndoe3</userName>
            <fullName>John Doe Mother</fullName>
        </user>
        <user>
            <userName>johndoe4</userName>
        </user>
    </users>
</searchResult>

结果是:

{
  "searchResult": {
    "status": "OK",
    "users": {
      "user": [
        { "userName": "johndoe" },
        {
          "userName": "johndoe1",
          "fullName": "John Doe"
        },
        { "userName": "johndoe2" },
        {
          "userName": "johndoe3",
          "fullName": "John Doe Mother"
        },
        { "userName": "johndoe4" }
      ]
    }
  }
}

但我想:

{
  "searchResult": {
    "status": "OK",
    "users": [
      { "userName": "johndoe" },
      {
        "userName": "johndoe1",
        "fullName": "John Doe"
      },
      { "userName": "johndoe2" },
      {
        "userName": "johndoe3",
        "fullName": "John Doe Mother"
      },
      { "userName": "johndoe4" }
    ]
  }
}

在“用户”中分组“用户”,因为这是一个只有一个孩子的数组。

我已经搜索了另一个类以将 XML 转换为 JSON 以获得此结果,但我没有找到任何资源。

你能帮我解决我的问题吗?

在此先感谢,最好的问候法布里斯

4

1 回答 1

0

您链接的文章已经过时了。例如Services_JSON通常不再需要。

目前稳定的 PHP 5.4 版本具有json_encode()功能JsonSerializable界面以及iterator_to_array. 即使您使用的是较旧的 PHP 5.3 版本,以下示例也很容易采用。

所以你真正需要的是你自己的 JSON 编码SimpleXMLElement

所以首先,让我们创建“我们自己的”Json 编码器:

class XML2Json extends SimpleXMLElement
{
}

哇。那太简单了。让我们检查它是否有效:

$converter = new XML2Json($bufferXml);

echo json_encode($converter, JSON_PRETTY_PRINT), "\n";

结果已经与结果相似Services_JSON

{
    "status": "OK",
    "users": {
        "user": [
            {
                "userName": "johndoe"
            },
            {
                "userName": "johndoe1",
                "fullName": "John Doe"
            },
            {
                "userName": "johndoe2"
            },
            {
                "userName": "johndoe3",
                "fullName": "John Doe Mother"
            },
            {
                "userName": "johndoe4"
            }
        ]
    }
}

但这不合适。如输出所示,缺少searchResult属性,并且用户不像您想要的那样位于单个数组中。

所以json_encode需要用户自定义。为了在 PHP 中做到这一点,PHP 具有JsonSerializable接口。它由一个名为的方法组成,如果名称是searchResultjsonSerialize(),我们现在将使它返回一个不同的值,以提供它的名称作为属性和用户作为平面数组。让我们扩展和实现接口:

class XML2JsonSearchResult extends XML2Json implements JsonSerializable
{

    public function jsonSerialize()
    {
        $name = $this->getName();

        if ($name !== 'searchResult') {
            return $this;
        }

        $value          = (array)$this;
        $value['users'] = iterator_to_array($value['users']->user, FALSE);

        return [$name => $value];
    }
}

所有没有名称searchResult的元素都将通过返回$this.

searchResult将被命名,并且它的用户被该iterator_to_array()函数展平。

这就是你需要做的。同样是用法示例,它的工作原理完全相同,只是这次类名不同:

$converter = new XML2JsonSearchResult($bufferXml);

echo json_encode($converter, JSON_PRETTY_PRINT);

现在的输出就像你想要的那样:

{
    "searchResult": {
        "status": "OK",
        "users": [
            {
                "userName": "johndoe"
            },
            {
                "userName": "johndoe1",
                "fullName": "John Doe"
            },
            {
                "userName": "johndoe2"
            },
            {
                "userName": "johndoe3",
                "fullName": "John Doe Mother"
            },
            {
                "userName": "johndoe4"
            }
        ]
    }
}

希望这能给你一个很好的例子,现在如何做到这一点。

整个代码示例一目了然(在线演示):

class XML2JsonSearchResult extends SimpleXMLElement implements JsonSerializable
{

    public function jsonSerialize()
    {
        $name = $this->getName();

        if ($name !== 'searchResult') {
            return $this;
        }

        $value          = (array)$this;
        $value['users'] = iterator_to_array($value['users']->user, FALSE);

        return [$name => $value];
    }
}

$converter = new XML2JsonSearchResult($bufferXml);

echo json_encode($converter, JSON_PRETTY_PRINT);
于 2013-06-05T11:08:06.800 回答