PHP로 JSON에서 데이터를 추출하려면 어떻게해야합니까?

Mar 28 2015

이것은 끝나지 않는 많은 "내 JSON에서 데이터에 액세스하려면 어떻게해야합니까?"를 다루는 일반적인 참조 질문 및 답변입니다. 질문. PHP에서 JSON을 디코딩하고 결과에 액세스하는 데 대한 광범위한 기본 사항을 처리합니다.

JSON이 있습니다.

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

PHP에서 이것을 디코딩하고 결과 데이터에 액세스하려면 어떻게해야합니까?

답변

460 user3942918 Mar 28 2015 at 02:38

소개

먼저 문자열이 있습니다. 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

이것은 다음 중 하나 때문에 발생합니다.

  1. JSON은 전적으로 null.
  2. JSON이 유효하지 않습니다. 결과를 확인 json_last_error_msg하거나 JSONLint 와 같은 것을 통해 입력하십시오 .
  3. 여기에는 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()즉시 처리 할 수없는 경우 문제가 발생하기 시작합니다. 보다:


정렬 방법

참조 : 참조 : PHP에서 배열과 데이터를 정렬하는 모든 기본 방법 .

19 MohdAbdulMujib Oct 26 2016 at 20:24

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값을 반환 할 수 있습니다.
2 Sayeedamin Nov 06 2019 at 19:31
// 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>";
}
1 KankatalaKrishna Aug 06 2019 at 13:08

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
PaulBurilichev Jan 22 2020 at 21:48

https://packagist.org/packages/flow/jsonpath 사용 고려JSONPath

제안 된 모든 루프를 피하면서 JSON 파일을 사용하고 구문 분석하는 방법에 대한 매우 명확한 설명이 있습니다 . 당신이 잘 알고있는 경우 XPath를 위해 XML이 방법을 사랑하기 시작합니다.