【问题标题】:php json_encode changed behaviour in php 5.4php json_encode 在 php 5.4 中改变了行为
【发布时间】:2014-05-25 12:34:07
【问题描述】:

我有以下xml

$resultXML=<<<XML

<Mapper ProviderCode="" ProviderName="" SessionID="" Supplier="" ProviderSupplier="">
<ProviderSupplierName/>
</Mapper>

XML;

当我发布时:

$sxml = simplexml_load_string($resultXML);
echo json_encode($sxml);

PHP Version 5.3.3-7+squeeze15,我得到:

"Mapper": {
    "@attributes": {
        "ProviderCode": "",
        "ProviderName": "",
        "SessionID": "",
        "Supplier": "",
        "ProviderSupplier": ""
    },
    "ProviderSupplierName": {}
}

PHP Version 5.4.4-14+deb7u8 中,我得到:

"Mapper": {
    "0": {},
    "@attributes": {
        "ProviderCode": "",
        "ProviderName": "",
        "SessionID": "",
        "Supplier": "",
        "ProviderSupplier": ""
    }
}

我想使用PHP Version 5.4.4-14+deb7u8 并获得与PHP Version 5.3.3-7+squeeze15 相同的结果。

实际上这个 xml 是一个很长的 xml 的一部分。当我在这种情况下提取它时,我在两个版本的 php 上都得到了相似的结果。

完整的xml可以在https://drive.google.com/file/d/0B9zOzk6voXHKQ3N1ZklfVFVITFU/edit?usp=sharing找到

我注意到的另一件事是,如果我使用链接中给出的 xml,我会像第二个示例一样获得 json,但是如果我使用 xml 格式化程序并格式化 xml,那么我会在第一个示例中获得 json .

有什么帮助吗?

【问题讨论】:

  • json_encode 的行为没有改变。但也许simplexml_load_string 做到了。
  • 这对我来说似乎是一个经典的X/Y Problem:不管为什么它在不同的环境中表现不同,像这样盲目地将 XML 文档转换为 JSON 似乎是一个相当没有意义的练习。你实际上想要达到什么目的?
  • “实际上这个 xml 是一个很长的 xml 的一部分。当我像这种情况一样提取它时,我在两个版本的 php 上都得到了相似的结果。”
  • @IMSoP 我已经编辑了问题并包含了完整的 xml。

标签: php xml json


【解决方案1】:

您只需要&lt;ProviderSupplierName/&gt; 标签来重现问题,正如您已经提到的,当您reformat the source XML and add white space around it 时会发生不同的输出:

<Hotels>
    <Hotel>
        <Mapper><ProviderSupplierName/></Mapper>
    </Hotel>
</Hotels>
{"Hotel":{"Mapper":{"0":{}}}}
<Hotels>
    <Hotel>
        <Mapper>
            <ProviderSupplierName/>
        </Mapper>
    </Hotel>
</Hotels>
{"Hotel":{"Mapper":{"ProviderSupplierName":{}}}}

要获得coherent pre-PHP/5.4 automated parsing,您可以提供LIBXML_NOBLANKS 标志(«删除空白节点»):

$sxml = simplexml_load_string($resultXML, 'SimpleXMLElement', LIBXML_NOBLANKS);

(很难说更改是否是故意的,但消失的标签名称感觉就像一个错误。)

【讨论】:

  • 感谢您找到轻松重现问题的方法并提供解决方案。它看起来确实像一个错误。我会检查bugs.php.net/report.php,看看是否有人报告了类似的问题并采取必要的措施。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 2020-12-08
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2011-09-04
  • 2011-10-12
相关资源
最近更新 更多