php将xml转化为json,当有一个孩子时,PHP将XML转换为JSON组

例如,这个XML:

OK

johndoe

johndoe1

John Doe

johndoe2

johndoe3

John Doe Mother

johndoe4

结果是:

{

"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以获得此结果,但我找不到任何资源.

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

在此先感谢,最好的问候Fabrice

解决方法:

你链接的文章已经过时了.例如,通常不再需要Services_JSON.

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

首先,让我们创建“我们自己的”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接口.它由一个名为jsonSerialize()的方法组成,如果名称为searchResult,它将返回一个不同的值,以提供它的名称作为属性,将用户作为一个平面数组.让我们扩展并实现接口:

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来获取其默认的JSON编码.

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"

}

]

}

}

希望这能为你提供一个如何做到这一点的好例子.

整个代码示例一目了然(Online Demo):

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);

标签:php,json,xml,converter,simplexml

来源: https://codeday.me/bug/20190923/1814280.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值