이것은 끝없는 “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 value’
입니다. 키 ‘bar’의 값은 ‘bar value’
입니다. 키 ‘baz’의 값은 ‘baz value’입니다.
데이터가 어떻게 구성되어 있는지 모름
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을 생성하는 쿼리하는 서비스에 버그가 있음)를 찾아서 발생하지 않도록하십시오.
객체 속성 이름에 특수 문자가 포함되어 있습니다
때로는 하이픈 -
이나 기호 @
로 리터럴 식별자로 사용할 수없는 객체 속성 이름이 있습니다 . 대신 중괄호 안에 문자열 리터럴을 사용하여이를 해결할 수 있습니다.
$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()
한 번에 처리 하기 에 너무 큰 경우 상황이 까다로워지기 시작합니다. 보다:
정렬하는 방법
참조 : PHP에서 배열과 데이터를 정렬하는 모든 기본 방법을 참조 하십시오 .
답변
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
이 방법을 사랑하기 시작합니다.
답변
JSON
( GitHub , Packagist ) 라는 패키지를 작성했습니다 . json_*
함수 사용으로 인한 오버 헤드를 방지 하려면 시도해야합니다.
예
use MAChitgarha\Component\JSON;
$jsonStr = <<<JSON
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
JSON;
// Create an instance
$json = new JSON($jsonStr);
// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles
// Iterate over an element
foreach ($json->iterate("toppings") as $item)
echo "{$item->id}: {$item->type}", PHP_EOL;
// Change an element
$json->set("toppings.3", [
"id" => "5000",
"type" => "Unknown"
]);
// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();
또한 JSON 파일을 읽고 데이터를 추출하려면 (이 작업을 수행하려고하는 것처럼 보입니다) JSONFile 패키지도 참조하십시오 .
답변
https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w
에서 JSON을 배열로 변환하는 코드를 아래에서 확인하십시오 PHP
.JSON이 올바른 경우 json_decode()
잘 작동하고 배열을 반환하지만 잘못된 JSON을 반환 NULL
하면,
<?php
function jsonDecode1($json){
$arr = json_decode($json, true);
return $arr;
}
// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );
JSON 형식이 잘못되어 배열 만 필요한 경우이 함수를 사용할 수 있습니다.
<?php
function jsonDecode2($json){
$arr = (array) json_decode($json, true);
return $arr;
}
// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );
JSON이 잘못되어 코드 실행을 중지하려는 경우이 함수를 사용할 수 있습니다.
<?php
function jsonDecode3($json){
$arr = (array) json_decode($json, true);
if(empty(json_last_error())){
return $arr;
}
else{
throw new ErrorException( json_last_error_msg() );
}
}
// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );
요구 사항에 따라 모든 기능을 사용할 수 있습니다.