PHP로 JSON에서 데이터를 추출하려면 어떻게해야합니까?
이것은 끝나지 않는 많은 "내 JSON에서 데이터에 액세스하려면 어떻게해야합니까?"를 다루는 일반적인 참조 질문 및 답변입니다. 질문. PHP에서 JSON을 디코딩하고 결과에 액세스하는 데 대한 광범위한 기본 사항을 처리합니다.
JSON이 있습니다.
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
PHP에서 이것을 디코딩하고 결과 데이터에 액세스하려면 어떻게해야합니까?
답변
소개
먼저 문자열이 있습니다. JSON은 배열, 객체 또는 데이터 구조가 아닙니다. JSON 은 텍스트 기반 직렬화 형식이므로 멋진 문자열이지만 여전히 문자열입니다. 을 사용하여 PHP에서 디코딩합니다 json_decode()
.
$data = json_decode($json);
거기에서 다음을 찾을 수 있습니다.
이것들은 JSON으로 인코딩 할 수있는 것들입니다. 또는 더 정확하게는 JSON으로 인코딩 할 수있는 PHP 버전입니다.
그들에 대해 특별한 것은 없습니다. "JSON 객체"또는 "JSON 배열"이 아닙니다. JSON을 디코딩했습니다. 이제 기본적인 PHP 유형 이 생겼습니다 .
객체는 여기서 중요하지 않은 일반적인 것 인 내장 클래스 인 stdClass의 인스턴스가 될 것 입니다.
개체 속성에 액세스
다른 객체의 공용 비 정적 속성 (예 :)에 대해와 동일한 방식으로 이러한 객체 중 하나의 속성 에 액세스합니다 $object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
배열 요소에 액세스
이러한 배열 중 하나의 요소에 다른 배열 (예 : $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
을 사용하여 반복하십시오 foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
유약을 바른
초콜릿과 뿌리
메이플
또는 bazillion 내장 배열 함수 중 하나를 엉망으로 만듭니다.
중첩 된 항목에 액세스
객체의 속성과 배열의 요소는 더 많은 객체 및 / 또는 배열이 될 수 있습니다 $object->array[0]->etc
. 예를 들어 평소처럼 속성과 멤버에 계속 액세스 할 수 있습니다 .
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
echo $yummy->toppings[2]->id; //5004
json_decode ()에true
두 번째 인수로 전달
이렇게하면 객체 대신 연관 배열 (키 문자열이있는 배열)을 얻게됩니다. 다시 평소와 같이 그 요소에 액세스합니다 $array['key']
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json, true);
echo $yummy['toppings'][2]['type']; //Maple
연관 배열 항목에 액세스
JSON 객체 를 연관 PHP 배열로 디코딩 할 때 foreach (array_expression as $key => $value)
구문을 사용하여 키와 값을 모두 반복 할 수 있습니다.
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
인쇄물
키 'foo'의 값은 'foo 값'
입니다. 키 'bar'의 값은 'bar 값'
입니다. 키 'baz'의 값은 'baz 값'입니다.
데이터가 어떻게 구성되어 있는지 모름
JSON을 얻는 것이 무엇이든 문서를 읽으십시오.
JSON을보세요-중괄호 {}
는 객체를 예상하고, 대괄호 []
는 배열을 기대합니다.
디코딩 된 데이터를 다음과 같이 누르십시오 print_r()
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
print_r($yummy);
출력을 확인하십시오.
stdClass Object
(
[type] => donut
[name] => Cake
[toppings] => Array
(
[0] => stdClass Object
(
[id] => 5002
[type] => Glazed
)
[1] => stdClass Object
(
[id] => 5006
[type] => Chocolate with Sprinkles
)
[2] => stdClass Object
(
[id] => 5004
[type] => Maple
)
)
)
객체가있는 위치, 배열이있는 위치, 멤버의 이름 및 값을 알려줍니다.
당신은 지금까지에 당신이 길을 잃기 전에 얻을 수있는 경우 - 멀리 타격이 가서 그 와 print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
이 편리한 대화 형 JSON 탐색기 에서 살펴보십시오 .
문제를 머리를 감싸기 쉬운 조각으로 나누십시오.
json_decode()
보고 null
이것은 다음 중 하나 때문에 발생합니다.
- JSON은 전적으로
null
. - JSON이 유효하지 않습니다. 결과를 확인
json_last_error_msg
하거나 JSONLint 와 같은 것을 통해 입력하십시오 . - 여기에는 512 레벨 이상의 중첩 된 요소가 포함되어 있습니다. 이 기본 최대 깊이는에 세 번째 인수로 정수를 전달하여 재정의 할 수 있습니다
json_decode()
.
최대 깊이를 변경해야하는 경우 아마도 잘못된 문제를 해결하는 것입니다. 왜 그렇게 깊게 중첩 된 데이터 (예 : JSON을 생성하는 쿼리하는 서비스에 버그가 있음)를 얻고 있는지 알아보고 그런 일이 발생하지 않도록하십시오.
개체 속성 이름에 특수 문자가 포함되어 있습니다.
때로는 리터럴 식별자에 사용할 수없는 하이픈 -
이나 at 기호 와 같은 것을 포함하는 객체 속성 이름이있을 것 @
입니다. 대신 중괄호 안에 문자열 리터럴을 사용하여 주소를 지정할 수 있습니다.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
속성으로 정수가있는 경우 정수 와 같은 이름으로 개체 속성에 액세스하는 방법을 참조하세요. 참고로.
누군가 JSON에 JSON을 넣습니다.
우스꽝 스럽지만 발생합니다. JSON 내에 문자열로 인코딩 된 JSON이 있습니다. 디코딩하고, 평소처럼 문자열에 액세스하고, 디코딩 한 다음 결국 필요한 것을 얻습니다.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
데이터가 메모리에 맞지 않습니다.
JSON이 너무 커서 json_decode()
즉시 처리 할 수없는 경우 문제가 발생하기 시작합니다. 보다:
정렬 방법
json_decode () 를 사용 하여 json 문자열을 PHP 객체 / 배열로 변환 할 수 있습니다 .
예 :
입력:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
산출:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
기억해야 할 몇 가지 사항 :
json_decode
문자열이 유효해야하며json
그렇지 않으면 반환NULL
됩니다.- 디코딩에 실패한
json_last_error()
경우 오류의 정확한 특성을 확인하는 데 사용할 수 있습니다. utf8
내용 을 전달했는지 확인하십시오. 그렇지 않으면json_decode
오류가 발생하여NULL
값을 반환 할 수 있습니다.
// Using json as php array
$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';
//or use from file
//$json = file_get_contents('results.json');
$someArray = json_decode($json, true);
foreach ($someArray as $key => $value) {
echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
PHP에서 json_decode 함수를 사용하여 json 문자열을 배열로 디코딩 할 수 있습니다.
1) json_decode ($ json_string) // 객체를 반환합니다.
2) json_decode ($ json_string, true) // 배열을 반환합니다.
$json_string = '{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$array = json_decode($json_string,true);
echo $array['type']; //it gives donut
https://packagist.org/packages/flow/jsonpath 사용 고려JSONPath
제안 된 모든 루프를 피하면서 JSON 파일을 사용하고 구문 분석하는 방법에 대한 매우 명확한 설명이 있습니다 . 당신이 잘 알고있는 경우 XPath
를 위해 XML
이 방법을 사랑하기 시작합니다.