【问题标题】:Send xml string in json object using php slim使用 php slim 在 json 对象中发送 xml 字符串
【发布时间】:2017-01-04 09:29:32
【问题描述】:

我使用 slim 框架 3 编写了一个 REST Api,并像这样以 JSON 格式返回响应,

return $response->withHeader(
        'Content-type',
        'application/json; charset=utf-8'
    )->withJson($data, 200);

工作正常。

$xml = '<?xml version="1.0" encoding="UTF-8"?><dialog createdBy=""createDate=""><dialog>' // looks like this

$data = [
    'name' => 'xmlName',
    'xml'  => $xml // fetching from db
]

现在,我将 xml 字符串存储在数据库中并想将其发送到客户端,我必须将该 xml 字符串保存在另一个数据库中。

但是当我对 xml 字符串进行编码时,我的 json 会中断。

我也试过了,

json_encode($data, JSON_HEX_TAG);

将我的 xml 转换为。

"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?\u003E\n\u003Cdialog createdBy=\"\"

如何正确编码 JSON 格式的 xml,然后按原样取回原始 xml 字符串?

非常感谢您的反馈。

【问题讨论】:

    标签: php json xml slim


    【解决方案1】:

    如果您查看withJson() 源代码,您会发现它对数据所做的一切就是使用json_encode() 处理数据——在 Slim 方面并没有什么特别之处。事实上,你的 XML 很好\u003C\u003E&lt;&gt; 的实体。请记住,JSON 是一种用于计算机而非人的数据格式!

    此外,JSON spec 声明您需要拥有顶级对象或数组。因此,您不能只将字符串发送回客户端并期望将其作为 JSON 处理,因为它不会是 JSON。如果json_encode() 不只是崩溃,那是因为它被设计为对部分 JSON 进行编码,因为它有时是一个有用的功能。您绝对需要设计一个有效的 JSON 结构,例如:

    ->withJson(array($xml), 200)
    

    【讨论】:

    • 其实我是在编码一个数组,xml字符串存在于那个数组中。
    【解决方案2】:

    实际上,我只是通过@Álvaro González 给出的 htmlentities 提示找到了答案。 我刚刚转换了我的 xml 字符串,例如,

    [
        'name' => 'xmlName',
        'xml'  => htmlentities($xml) 
    ]
    

    我能够按原样接收 xml 字符串,而没有任何 json 中断。

    【讨论】:

    • htmlentities() 只会破坏您的 XML(或至少强制接收方撤消编码)。为什么你认为你需要它?
    • 我认为它工作正常,如果我按原样传递 $xml,我的 json 就会中断。这就是我使用 htmlentities() 的原因。这样我的 json 就不会中断,我也不必撤消它。我收到了完全相同的字符串。
    • 你一定在做一些你没有说过的事情(例如在浏览器中显示 XML 或使用某个库处理数据)。这个网站旨在成为一个集体知识库,任何在这里谷歌搜索的人都会得到json_encode() 已损坏或不完整的错误印象,事实并非如此。
    • @Álvaro González,正如我在问题中所说,我必须从一个包含具有 xml 数据的列的数据库表中获取一行,然后使用 Web 服务将其保存到另一个数据库。当我使用 RestAPI 客户端发布我的 web 服务时,它返回了损坏的 json。正如我上面提到的,我只是使用 slim 来返回响应。当我用 htmlentities() 手动转换我的 xml 字符串时,它工作正常,我收到了很好的 json。我简单地解码了那个 json 并将它保存到另一个数据库表中,这是我的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多