0

I cannot figure out how to get the following keys/values from the JSON below:

I need to print out in a for loop:

'projects' i.e 'test-project-1'

'datasets' i.e 'dataset1'

'permissions' i.e 'role: WRITER, group: test1@test.com'

{
   "projects":{
      "test-project-1":{
         "datasets":{
            "dataset1":{
               "permissions":{
                  "role":"WRITER",
                  "group":"test1@test.com"
               }
            },
            "dataset2":{
               "permissions":{
                  "role":"READER",
                  "group":"test2@test.com"
               }
            },
            "dataset3":{
               "permissions":{
                  "role":"READER",
                  "group":"test3@test.com"
               }
            },
            "dataset4":{
               "permissions":{
                  "role":"READER",
                  "group":"test4@test.com"
               }
            },
            "dataset5":{
               "permissions":{
                  "role":"READER",
                  "group":"test5@test.com"
               }
            }
         }
      },
      "test-project-2":{
         "datasets":{
            "dataset1":{
               "permissions":{
                  "role":"WRITER",
                  "group":"test1@test.com"
               }
            },
            "dataset2":{
               "permissions":{
                  "role":"READER",
                  "group":"test2@test.com"
               }
            },
            "dataset3":{
               "permissions":{
                  "role":"READER",
                  "group":"test3@test.com"
               }
            },
            "dataset4":{
               "permissions":{
                  "role":"READER",
                  "group":"test4@test.com"
               }
            },
            "dataset5":{
               "permissions":{
                  "role":"READER",
                  "group":"test5@test.com"
               }
            }
         }
      }
   }
}

I tried this but the only thing that prints out is "Array".

Something like this does not work:

$new_json = {path_to_json};
$new_projects = $new_json['projects'];
foreach ($new_projects as $project) {
    echo $project . "<br>";
    foreach ($new_projects['datasets'] as $datasets){
        echo $datasets . "<br>";
    }
}
user3282173
  • 103
  • 1
  • 10

3 Answers3

0

PHP code demo

$json='{
   "projects":{
      "test-project-1":{
         "datasets":{
            "dataset1":{
               "permissions":{
                  "role":"WRITER",
                  "group":"test1@test.com"
               }
            },
            "dataset2":{
               "permissions":{
                  "role":"READER",
                  "group":"test2@test.com"
               }
            },
            "dataset3":{
               "permissions":{
                  "role":"READER",
                  "group":"test3@test.com"
               }
            },
            "dataset4":{
               "permissions":{
                  "role":"READER",
                  "group":"test4@test.com"
               }
            },
            "dataset5":{
               "permissions":{
                  "role":"READER",
                  "group":"test5@test.com"
               }
            }
         }
      },
      "test-project-2":{
         "datasets":{
            "dataset1":{
               "permissions":{
                  "role":"WRITER",
                  "group":"test1@test.com"
               }
            },
            "dataset2":{
               "permissions":{
                  "role":"READER",
                  "group":"test2@test.com"
               }
            },
            "dataset3":{
               "permissions":{
                  "role":"READER",
                  "group":"test3@test.com"
               }
            },
            "dataset4":{
               "permissions":{
                  "role":"READER",
                  "group":"test4@test.com"
               }
            },
            "dataset5":{
               "permissions":{
                  "role":"READER",
                  "group":"test5@test.com"
               }
            }
         }
      }
   }
}';
$array=  json_decode($json,true);
foreach($array["projects"] as $projectName => $projects)
{
    echo "Project name ".$projectName."<br/>";
    foreach($projects["datasets"] as $databaseNames => $databaseData)
    {
        echo "  Database name ".$databaseNames."<br/>";
        echo "  Database role ".$databaseData["permissions"]["role"]."<br/>";
        echo "  Database group ".$databaseData["permissions"]["group"]."<br/>";
    }
}
Sahil Gulati
  • 15,028
  • 4
  • 24
  • 42
  • this works great! How do I access the 'role' and 'group' data in the nested 'permissions'? – user3282173 Mar 29 '17 at 03:59
  • just use `$databaseData["permissions"]["role"]` or `$databaseData["permissions"]["group"]` you want in the nested for loop where i am printing database name – Sahil Gulati Mar 29 '17 at 04:01
  • Can you update the code demo to reflect that, please? I tried it on my side and it did not work. I'll accept your answer after that. Thank you. – user3282173 Mar 29 '17 at 04:06
0

the format is foreach ("array" as "key in array")

foreach ($new_json as $new_projects) {
    echo $new_projects . "<br>";
    $datasets=$new_projects['datasets'];
    foreach ($new_projects as $datasets){
        echo $datasets . "<br>";
    }
}
Gert
  • 360
  • 3
  • 8
0

You need to use json_decode function PHP Manual

$jsonArray = json_decode($jsonData, true);
foreach($jsonArray as $project){
    echo $project . '<br>';
    foreach($project['datasets'] as $dataset)
    {
        echo $dataset . '<br>';
        foreach($dataset['permissions'] as $permissions)
        {
            echo sprintf('Role: %s, group: %s<br>', $permissions['role'], $permissions['group'];
        }
    }
}

if you dont want json to be converted to array, you need to pass false as second argument and stdClass will be returned instead.

Entrio
  • 31
  • 1
  • 8