【问题标题】:Create JSON response from Parsed XML PHP从 Parsed XML PHP 创建 JSON 响应
【发布时间】:2018-11-07 15:20:30
【问题描述】:

我正在通过 eBay API 响应进行解析。我想把它传递给一个更干净、更容易用 JavaScript 解析的网站。我成功解析了 XML……但现在将其转换为 JSON 重新发送回客户端让我有些头疼。

注意:$resp 是 eBay 的回复。使用下面的代码成功解析的是它们的全长 XML。

例如...$valueName 可能是Grade。然后我进入下一个 foreach 循环并获取它的值。这些values 可能是10, 9.5, 9 等。

这是我的 PHP 代码。

$arrayName = array();
$arrayValue = array();

foreach($resp->aspectHistogramContainer->aspect as $name) {
    $nameAspect = $name['name'];
    //$arrayName["aspectName"] = $nameAspect;

    foreach($name->valueHistogram as $value) {
        $valueAspect = $value['valueName'];
        //$arrayValue["aspectValue"] = $valueAspect;    
    }

    //array_push($arrayName, $arrayValue);
}
echo json_encode($arrayName);

所以,不用我尝试创建自己的 JSON,我就能得到我需要的东西。我回显结果,它与此类似...

名字

----- 价值

----- 价值

----- 价值

名字

----- 价值

名字

等等等等

对于 JSON 响应...我正在寻找类似...

[
  {
        "name": "NAME",
        "value": ["value", "value"]
    }, {
        "name": "name",
        "value": ["value", "value"]
    }
]

任何帮助和指导将不胜感激。

eBay 的回复是这样的(还有很多 <aspect> 和 <valueHistogram>)

<getHistogramsResponse xmlns="http://www.ebay.com/marketplace/search/v1/services">
<ack>Success</ack>
<version>1.13.0</version>
<timestamp>2018-11-07T15:32:20.380Z</timestamp>
<aspectHistogramContainer>
<domainDisplayName>Baseball Cards</domainDisplayName>
<aspect name="Card Manufacturer">
<valueHistogram valueName="Ace Authentic">
<count>19</count>
</valueHistogram>
<valueHistogram valueName="American Caramel">
<count>2024</count>
</valueHistogram>
<valueHistogram valueName="APBA">
<count>10554</count>
</valueHistogram>
<valueHistogram valueName="Bazooka">
<count>8826</count>
</valueHistogram>
<valueHistogram valueName="Be A Player">
<count>17</count>
</valueHistogram>
<valueHistogram valueName="Bell Brand Dodgers">
<count>334</count>

【问题讨论】:

  • 你忘记向我们展示 $resp 的样子,所以我们知道我们可能需要如何操作它。
  • '$resp' 是来自 eBay 的响应。它是解析的 XML 代码。你将成为 aspectName 和 aspectValue... 这就是我正在使用的。
  • 是的,但我们需要了解它的结构才能进行翻译。我不想要原始 XML,只想要 PHP 对象结构。一个 var_dump 输出的例子就可以完成这项工作。
  • 我认为您可以可能执行$arrayValue["aspectValue"][] = $valueAspect;,但如果没有看到实际结构,我不能 100% 确定。 (在内部循环之前,您可能需要$arrayValue["aspectValue"] = array()。
  • @ADyson 添加了结构

标签: php json xml


【解决方案1】:

要对其进行编码(并假设为 SimpleXML),只需构建每个内部 $aspect 数据数组,然后将值添加到其中。我使用(string) 来确保数据不会存储为 SimpleXMLElement,这可能会导致副作用...

$arrayName = array();

foreach($resp->aspectHistogramContainer->aspect as $name) {
    $aspect = [ "name" => (string)$name['name']];

    foreach($name->valueHistogram as $value) {
        $aspect["value"][] = (string)$value['valueName'];
    }
    $arrayName[] = $aspect;
}
echo json_encode($arrayName);

使用示例 XML,这给出了...

[{"name":"Card Manufacturer","value":["Ace Authentic","American Caramel","APBA","Bazooka","Be A Player","Bell Brand Dodgers"]}]

【讨论】:

    【解决方案2】:

    创建一个数组$resultArray 并将值存储在其中。通过以最小的更改维护您当前的代码结构,这里是更新的代码 sn-p,

    $resultArray = array();
    
    $i = 0; // Maintain Array Index value
    foreach($resp->aspectHistogramContainer->aspect as $name) {
        $resultArray[$i]["aspectName"] = (string)$name['name'];;
    
        foreach($name->valueHistogram as $value) {
            $resultArray[$i]["aspectValue"][] = (string)$value['valueName'];
        }
        $i++; // Increment array index to store next value
    }
    echo json_encode($resultArray);
    

    【讨论】:

      【解决方案3】:
      $results = array();
      
      // Parse the XML into a keyed array
      
      foreach($resp->aspectHistogramContainer->aspect as $name) {
          $nameAspect = (string) $name['name'];
          $values = array();
          foreach($name->valueHistogram as $value) {
              $values[] = (string) $value['valueName'];
          }
          $results[$nameAspect] = $values;
      }
      
      // This keeps things simple - rewrite to the required JSON format
      
      $outputForJSON = array();
      foreach ($results as $name => $values) {
          $outputForJSON[] = array(
               "name" => $name,
               "values" => $values
          );
      }
      
      echo json_encode($outputForJSON);
      

      【讨论】:

      • 这给了我一个非法的偏移量类型在 $results[$nameAspect] = $values;
      • 忘记将 XML 名称对象转换为字符串。那应该可以解决它!
      • 为什么要创建一个结构然后将其转换为第二个结构?这一切都可以一步完成(见其他答案)
      • 同意这一切都可以一步完成,但这个例子旨在展示如何通过使用键来重写数组以产生不同的输出。也许应该解释一下!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多