使用 php 从 Cucumber 解析扩展的 json 输出文件

parse extended json output file from cucumber with php

我正在尝试解析一个特殊的 json 内容。我从黄瓜执行中得到这个作为输出文件。目标是解码一些值,如 namestatus 和其他一些内容。我该如何编码。 另一个问题是将 json 转换为 CSV。 使用php对我来说并不重要。 Java 或 Perl 将是替代方案。 这个文件我要在 php 中调用:

$jsonconntent = file_get_contents("/home/xxx/test1.json");

json 内容如下所示(我只发布了开头):

[
    {
    "uri": "features/complete_ski.feature",
    "id": "complete_ski_with_time",
    "keyword": "Feature",
    "name": "Complete_Ski_with_time",
    "description": "",
    "line": 1,
    "elements": [
    {
        "id": "complete_ski_with_time;time_part_preamble",
        "keyword": "Scenario",
        "name": "time_part_preamble",
        "description": "",
        "line": 3,
        "type": "scenario",
        "before": [
        {
            "output": [
              "Default Timestamp start: 1516024716000"
            ],
            "match": {
              "location": "features/support/env.rb:32"
            },
            "result": {
              "status": "passed",
              "duration": 191690
            }
        },
        {
            "match": {
              "location": "capybara-2.17.0/lib/capybara/cucumber.rb:13"
        },
        "result": {
          "status": "passed",
          "duration": 52117
        }
      },
      {
        "match": {
          "location": "capybara-2.17.0/lib/capybara/cucumber.rb:21"
        },
        "result": {
          "status": "passed",
          "duration": 25885
        }
      }
    ],
    "steps": [
      {
        "keyword": "Given ",
        "name": "a Android A-Party",
        "line": 4,
        "output": [
          "Got handset with number unvisable, IMSI: notfor, android-Id: yourfone, VNC: 11111, port: 9981"
        ],
        "match": {
          "location": "features/step_definitions/idrp_steps.rb:11"
        },
        "result": {
          "status": "passed",
          "duration": 1415024760
        },
        "after": [
          {
            "match": {
              "location": "features/support/env.rb:24"
            },
            "result": {
              "status": "passed",
              "duration": 264339
            }
          }
        ]
      }

使用:

$data = json_decode($jsonconntent, true);

您将拥有 javascript objects 作为数组的数据,而不是 PHP objects。

要将其保存为CSV,这取决于数据的结构。这样的话就复杂了:

{
  "uri": "features/complete_ski.feature",
  "id": "complete_ski_with_time",
  "keyword": "Feature",
  "name": "Complete_Ski_with_time",
  "description": "",
  "line": 1,
  "elements": [
    {
      "id": "complete_ski_with_time;time_part_preamble",
      "keyword": "Scenario",
      "name": "time_part_preamble",
      "description": "",
      "line": 3,
      ...

如何将数据放入elements列?数据是如此嵌套,以至于无法将其转换为具有列 headers 且每行每列一个值的表格格式。

关于如何访问数据,你可以这样做:

$first_element_id = $data[0]['elements'][0]['id'];

foreach ( $data as $item ) {
    $uri = $item['uri'];
    foreach ( $item['elements'] as $element ) {
        $name = $element['name'];
    }
}

如其中一条评论所述,这是访问 'Default Timestamp start':

的方法
foreach ($data as $item) {
    foreach ($item['elements'] as $element) {
        foreach ($element['before'] as $before) {
            if (isset($before['output'])) {
                foreach ($before['output'] as $output) {
                    echo sprintf("%s\n", $output);
                }
            }
        }
    }
}