例如,这个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