PHP,json_encode,SimpleXML的对象json_decode(PHP, json_

2019-07-20 11:21发布

在我的应用程序的函数执行以下操作:

  • 使用史努比捕捉网页
  • 加载结果到DOM文档
  • DOM文档加载到简单的XML对象
  • 运行的XPath需要的文档部分隔离
  • json_encode结果并保存到数据库中供以后使用。

恢复从数据库中该块时,和解码是我的问题就出现了。 我可以看到@属性,当我的var_dump的对象,却找不到命令的组合,让我来访问它们。

错误消息是:致命错误:无法使用类型stdClass的的对象作为阵列

下面是我的对象的样本。 我已经试过了,其中包括使用什么工作。

echo $obj['class'];

stdClass Object
(
    [@attributes] => stdClass Object
        (
            [class] => race_idx_hdr
        )

    [img] => stdClass Object
        (
            [@attributes] => stdClass Object
                (
                    [src] => /Images/Icons/i_blue_bullet.gif
                    [alt] => image
                    [title] => United Kingdom
                )

        )

    [a] => Fast Cards
)

Answer 1:

当你解码从数据库中JSON,你会得到类型的对象“stdClass的”,而不是原始类型“的SimpleXMLElement”通过为SimpleXMLElement返回:: XPath函数。

所述stdClass的对象不“知道”关于使用的SimpleXMLElement对象,以允许访问的属性的伪阵列的语法。

通常你会使用序列化()和反序列化()函数而不是json_encode /解码存储在数据库中的对象,但不幸的是,SimpleXMLElements不与那些工作。

作为替代,为什么不只是存储实际的XML,并从数据库中获取它后,读给SimpleXML的:

// convert SimpleXMLElement back to plain xml string
$xml = $simpleXML->asXML();

// ... code to store $xml in the database
// ... code to retrieve $xml from database

// recreate SimpleXMLELement
$simpleXML = simplexml_load_string($xml);


Answer 2:

其实我真的不明白你正在试图做的,并在错误被抛出什么,但访问对象的属性,你可以使用

echo $obj->{'@attributes'}->class; // prints "race_idx_hdr"
echo $obj->img->{'@attributes'}->src; // prints "/Images/Icons/i_blue_bullet.gif"
echo $obj->img->{'@attributes'}->alt; // prints "image"
echo $obj->img->{'@attributes'}->title; // prints "United Kingdom"
echo $obj->a; // prints "Fast Cards"

这个奇怪的语法( $obj->{'@attributes'}因为需要@ -symbol在PHP保留,不能用于标识符。



Answer 3:

如果一个对象被转换成一个阵列,其结果是一个数组,其元素为对象的属性。

$asArray = (array)$myObj;
echo $asArray['@attribute'];


文章来源: PHP, json_encode, json_decode of SimpleXML Object