你不想拥有“@attributes
" 在 JSON 中编码的字段,但是这是 PHP JSON 序列化 SimpleXMLElement 的标准方式。
正如您所说,您想要更改它,您需要更改 PHP JSON 序列化对象的方式。这可以通过实施Json可序列化 with a 简单XML元素您自己,然后根据需要提供 JSON 序列化:
class JsonSerializer extends SimpleXmlElement implements JsonSerializable
{
/**
* SimpleXMLElement JSON serialization
*
* @return null|string
*
* @link http://php.net/JsonSerializable.jsonSerialize
* @see JsonSerializable::jsonSerialize
*/
function jsonSerialize()
{
// jishan's SimpleXMLElement JSON serialization ...
return $serialized;
}
}
例如。像所有子元素一样使用属性作为字段。
然后您可以轻松地集成它,例如代替
$xml = simplexml_load_string($result);
您可以使用
$xml = simplexml_load_string($result, 'JsonSerializer');
or just
$xml = new JsonSerializer($result);
其余功能的工作原理相同,但只是按照您的意愿序列化。
Example:
$result = str_replace(array("\n", "\r", "\t"), '', $data);
$xml = new JsonSerializer($result);
$object = new stdclass();
$object->webservice[] = $xml;
$result = json_encode($object, JSON_PRETTY_PRINT);
header('content-Type: application/json');
echo $result;
Output:
{
"webservice": [
{
"EBLCUSTOMER": {
"ACCOUNTNO": "11111",
"CUSTACCTNO": "121212",
"ACCTSTATUS": "active",
"CCYDESC": "BDT",
"BALANCE": "9999",
"AVAILABLEBALANCE": "99",
"CUSTOMERNAME": "cus_name",
"AMOUNTONHOLD": "1000",
"ODLIMIT": "99"
}
}
]
}
上例的序列化函数是:
function jsonSerialize()
{
// text node (or mixed node represented as text or self closing tag)
if (!count($this)) {
return $this[0] == $this
? trim($this) : null ;
}
// process all child elements and their attributes
foreach ($this as $tag => $element) {
// attributes first
foreach ($element->attributes() as $name => $value) {
$array[$tag][$name] = $value;
}
// child elements second
foreach($element as $name => $value) {
$array[$tag][$name] = $value;
}
}
return $array;
}
这里有一些注意事项:
- 在序列化中,您必须处理自己的元素类型。对于没有子元素的单个元素,区分是在顶部完成的。如果您需要对这些进行属性处理,则需要添加它。
- The
trim($this)
也许已经让你摆脱了你试图解决的问题$result = str_replace(array("\n", "\r", "\t"), '', $data);
. 简单XML元素在任何情况下 JSON 都会序列化“\r
“ 人物 (简单XML元素利用“\n
“用于休息)。此外,您可能对以下规则感兴趣:XML 中的空白规范化.
- 如果属性与子元素同名,则该属性将被子元素覆盖。
- 如果子元素后面有另一个同名的子元素,它将被覆盖。
最后两点只是为了保持示例代码简单。一种与标准 PHP JSON 序列化一致的方法简单XML元素在我的一系列博客文章中给出。
该过程的基础知识和示例Json序列化实施可在第三篇文章中找到:PHP 中的 SimpleXML 和 JSON 编码 - 第三部分和结束.
另一个相关问题是:
- 当有一个子组时,PHP 将 XML 转换为 JSON 组