gpt4 book ai didi

php - 当 XML SOAP 响应中存在单个元素时,JSON 对象而不是数组

转载 作者:行者123 更新时间:2023-12-02 04:20:29 25 4
gpt4 key购买 nike

我正在使用一个返回一些 XML 数据的网络服务。当我将 xml 数据转换为 json 时,问题就开始了。一些应该返回对象数组的元素,当它们只有一个值时,它们不会转换为内部只有一个对象的数组,它们会变成一个对象。因此,与其拥有:

{
"products":[ { "title":"Title 1", "attributes":[{"color":"blue"}] } ]
}

我明白了

{
"products":{ "title":"Title 1", "attributes":{"color":"blue"} }
}

php 数组看起来像这样

[products] => Array ( [title] => Title 1 [attributes] => Array ( [color] => blue ) )

而不是这个

[产品] => 数组([0] => 数组([标题] => 标题 1
[属性] => 数组([0] => 数组([颜色] => 蓝色)))

所以我所做的如下:

$xml = simplexml_load_string($messageData);
$json = json_encode($xml);
$array = json_decode($json, TRUE);

if (isset($array['products']) && !isset($array['products'][0])) {
$array['products'] = array($array['products']);
}

我检查是否有一个名为 products 的数组,如果它没有索引 0,我将它嵌套在一个新数组中。这样就可以了。然后我像这样对属性数组做同样的事情:

    $products = $array['products'];

$array['products'] = [];

foreach ($products as $product) {

if (isset($product['attributes']) && !isset($product['attributes'][0])) {

$product['attributes'] = array($product['attributes']);

}

array_push($array['products'], product);
}

在这里,我将 products 数组绑定(bind)到一个名为 products 的变量以在循环中使用它,然后清空数组,在创建新属性数组后,我用更改产品。

我的问题是:

有没有更好的方法来处理这个东西?我不喜欢我在这里做的事,但我想不出别的……

编辑

这是我的 SOAP 请求:


$client = new SoapClient($wsdl, $soapOptions);

$soapHeader = WsSecurity::createWsSecuritySoapHeader($username, $password, false, $synced, 60, true, true, false, true);

$client->__setSoapHeaders($soapHeader);

$response = $client->dateRetrieveMovement($dateMovementRequest);

$movements = $response->DateMovementRequestResult->movements;
$movementInfo = $movements->movementInfo;
$messages = $movementInfo->messages->messageExchanged;

$messageData = $messages->IEMessage->xmlData;

$xml = simplexml_load_string($messageData);
$json = json_encode($xml);
$array = json_decode($json, TRUE);

最佳答案

问题是“是否有更好的方法进行 XML 到 JSON 的转换”,我认为答案是“不是没有编码”。

标准的 XML 到 JSON 转换库对数据模型的语义了解不够,无法生成合适的数据表示形式。从理论上讲,一个工具可以尝试从模式或其他地方提取此类信息,但我不知道有任何工具可以这样做。

编写自定义 XSLT 转换以准确生成您想要的 JSON 并不太难,尤其是对于 XSLT 3.0,而且这可能比按照您描述的方式在接收应用程序中修补 JSON 更省力。

关于php - 当 XML SOAP 响应中存在单个元素时,JSON 对象而不是数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60253822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com