nested JSON 변환
PHP에서 재귀 함수를 이용해 nested 구조의 key들을 /로 구분 짓는 URI string으로 변환하는 예제이다.
이 또한 Restful API 구현에 필요한 기능의 일부이니 활용 가능한 환경이라면 도움이 되길 바란다.
이전에 python 으로 작성한 변환 방식과 유사하니 참고.
https://muabow.tistory.com/327
소스코드
- 최대한 쉽게 구현하고자 했다. 입력된 json array에 하위에 array가 있는지, 더 이상 하위가 없는 마지막 key string인지 지속적으로 파악하는 기능을 수행한다.
<?php
// JSON 포맷은 작성하기 귀찮아서 퍼옴..
// https://opensource.adobe.com/Spry/samples/data_region/JSONDataSetSample.html
$json_data = json_decode('{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devils Food" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}', true);
function parse_nested_json($_json, &$_path, $_parent = "" ) {
$arr_key = array_keys($_json);
foreach( $arr_key as $key ) {
if( is_array($_json[$key]) ) {
parse_nested_json($_json[$key], $_path, "{$_parent}/{$key}");
} else {
$_path[] = "{$_parent}/{$key}";
}
}
return ;
}
$arr_json_list = array();
parse_nested_json($json_data, $arr_json_list);
var_dump($arr_json_list);
?>
결과
array(26) {
[0]=>
string(3) "/id"
[1]=>
string(5) "/type"
[2]=>
string(5) "/name"
[3]=>
string(4) "/ppu"
[4]=>
string(20) "/batters/batter/0/id"
[5]=>
string(22) "/batters/batter/0/type"
[6]=>
string(20) "/batters/batter/1/id"
[7]=>
string(22) "/batters/batter/1/type"
[8]=>
string(20) "/batters/batter/2/id"
[9]=>
string(22) "/batters/batter/2/type"
[10]=>
string(20) "/batters/batter/3/id"
[11]=>
string(22) "/batters/batter/3/type"
[12]=>
string(13) "/topping/0/id"
[13]=>
string(15) "/topping/0/type"
[14]=>
string(13) "/topping/1/id"
[15]=>
string(15) "/topping/1/type"
[16]=>
string(13) "/topping/2/id"
[17]=>
string(15) "/topping/2/type"
[18]=>
string(13) "/topping/3/id"
[19]=>
string(15) "/topping/3/type"
[20]=>
string(13) "/topping/4/id"
[21]=>
string(15) "/topping/4/type"
[22]=>
string(13) "/topping/5/id"
[23]=>
string(15) "/topping/5/type"
[24]=>
string(13) "/topping/6/id"
[25]=>
string(15) "/topping/6/type"
}
혹시 key 가 아니라 key/value를 구하고 싶다면 위 소스코드를 수정해서 사용해도 되고 아래의 링크를 확인하자.
링크의 방식은 뭔가 좀 복잡해서 기회가 되면 간단하게 변경 해보려한다.
https://muabow.tistory.com/215
끝.
'IT > programming' 카테고리의 다른 글
[PHP] 변수명으로 함수 호출 / function_exists() (2) | 2022.03.04 |
---|---|
[PHP] URI '/'(slash) 중복 처리 / preg_replace, 정규식 (1) | 2022.03.04 |
[C++] 프로그래머스, 베스트앨범 (0) | 2022.02.23 |
[C++] 프로그래머스, 더 맵게 (2) | 2022.02.16 |
[C++] 프로그래머스, 전화번호 목록 (0) | 2022.02.16 |
댓글