Я пытаюсь разобрать специальный контент JSON. Я получил это как выходной файл из огуречного выполнения. Цель состоит в том, чтобы декодировать некоторые значения, такие как название статус и некоторый другой контент. Как я могу закодировать это.
Еще одной проблемой было бы превращение JSON в CSV.
Для меня не важно использовать php. Java или Perl будет альтернативой.
Этот файл я собираюсь вызвать в php:
$jsonconntent = file_get_contents("/home/xxx/test1.json");
JSON Conten выглядит следующим образом (я разместил только начало):
[
{
"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 в виде массивов, а не объектов PHP.
Чтобы сохранить его как 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
? Данные настолько вложены, что их невозможно преобразовать в табличный формат с заголовками столбцов и одним значением на столбец в каждой строке.
Что касается доступа к данным, вы можете сделать это:
$first_element_id = $data[0]['elements'][0]['id'];
foreach ( $data as $item ) {
$uri = $item['uri'];
foreach ( $item['elements'] as $element ) {
$name = $element['name'];
}
}
Как было сказано в одном из комментариев, это как получить доступ к «началу отметки времени по умолчанию»:
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);
}
}
}
}
}
Других решений пока нет …