PHP로 JSON에서 데이터를 어떻게 추출합니까?


214

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

JSON이 있습니다.

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

PHP에서 이것을 해독하고 결과 데이터에 어떻게 액세스합니까?



왜이 질문이 9 세 이하의 사용자조차도 stackoverflow.com/questions/4343596/parsing-json-file-with-php에 대해 중복으로 표시 된 중복 질문으로 간주하지 않는지 알 수 있습니까? M은
나는 가장 어리석은 사람이다

@IamtheMostStupidPerson 나는 당신의 사용자 이름이 당신이 그것을 얻을 것이라고 의심하더라도 설명하려고 노력할 것입니다;). 이 질문은 "정식"방식으로 질문되고 답변이 작성됩니다. 따라서 다른 질문보다 중복 대상의 수신자가 더 좋습니다.
Félix Gagnon-Grenier

답변:


428

소개

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

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

  1. JSON은 전적으로 그것으로 구성됩니다 null.
  2. JSON이 유효하지 않습니다. 결과를 확인 json_last_error_msg하거나 JSONLint 와 같은 것을 통해 입력하십시오 .
  3. 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에서 배열과 데이터를 정렬하는 모든 기본 방법을 참조 하십시오 .


방금이 답변을 우연히 발견하고 array.include-once.org에 대한 링크 가 끊어졌습니다.
Jeff

@ Jeff 감사합니다. 부끄러운 일입니다. 링크를 제거했습니다.
user3942918

예, 링크 이름과 설명 방법을 고려하면 실제처럼 들립니다.
Jeff

이 솔루션에 부족한 것은 다른 json 파일에서 데이터를 추출하는 방법이었습니다. 이 솔루션을 추천합니다 : stackoverflow.com/questions/19758954/…
Ishan Srivastava

대단하다. 감사합니다.
David Kariuki

17

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값을 반환 하는지 확인하십시오 .

그럼에도 불구하고 그들은 단순함을 좋아하지 않았을 수도 있습니다. 당신은 항상 upvote 수 있습니다;)
Mohd Abdul Mujib

1
아마도 더 가능성이 높은 이유는 이미 답변을 받았으며 @MohdAbdulMujib이 약간의 무료 담당자를 따르는 것 같습니다
Isaac

3
@Isaac 어떤 사람들은 단지 함수를 사용하기 시작하고 싶을 때 전체 매뉴얼을 읽고 싶어하지 않을 수도 있습니다. 그렇지 않으면 공식 문서를 읽는 것이 좋습니다. SO의 요점은 답변이 제공되는 단순성입니다. IMHO
Mohd 압둘 무지 브

3
// 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

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


-1

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();

wiki 또는 빠른 학습서 를 참조하십시오 .

또한 JSON 파일을 읽고 데이터를 추출하려면 (이 작업을 수행하려고하는 것처럼 보입니다) JSONFile 패키지도 참조하십시오 .


-2

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) );

요구 사항에 따라 모든 기능을 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.