I\'ve got following XML:
123
ACTIVE
I cannot add a comment, but I think this will work for you, it should be faster then a regex or a loop:
//after you json_encode, before you decode
$str = str_replace(':[]',':null',json_encode($array));
An empty array in JSON is represented by "[]
". Sometimes the arrays are parsed as objects, in that case (or as a fallback) you can replace ":{}
" too.
Check performance str_replace vs recursive loop
The str_replace quickly on ~0.00001 seconds. The difference will be noticeable in many calls
An empty SimpleXMLElement object will be casted to an empty array. You can change this by by extending from SimpleXMLElement and implementing the JsonSerializable interface and casting an it to null.
/**
* Class JsonXMLElement
*/
class JsonXMLElement extends SimpleXMLElement implements JsonSerializable
{
/**
* Specify data which should be serialized to JSON
*
* @return mixed data which can be serialized by json_encode.
*/
public function jsonSerialize()
{
$array = array();
// json encode attributes if any.
if ($attributes = $this->attributes()) {
$array['@attributes'] = iterator_to_array($attributes);
}
// json encode child elements if any. group on duplicate names as an array.
foreach ($this as $name => $element) {
if (isset($array[$name])) {
if (!is_array($array[$name])) {
$array[$name] = [$array[$name]];
}
$array[$name][] = $element;
} else {
$array[$name] = $element;
}
}
// json encode non-whitespace element simplexml text values.
$text = trim($this);
if (strlen($text)) {
if ($array) {
$array['@text'] = $text;
} else {
$array = $text;
}
}
// return empty elements as NULL (self-closing or empty tags)
if (!$array) {
$array = NULL;
}
return $array;
}
}
Then tell simplexml_load_string
to return an object of JsonXMLElement
class
$xml = <<<XML
<account>
<id>123</id>
<email></email>
<status>ACTIVE</status>
</account>
XML;
$obj = simplexml_load_string($xml, 'JsonXMLElement');
// print_r($obj);
print json_encode($obj, true);
/*
* Output...
{
"id": 123,
"email": null,
"status": "ACTIVE"
}
*/
Credit: hakre