Como faço para extrair dados de JSON com PHP?

Mar 28 2015

Esta é uma pergunta e resposta de referência geral cobrindo muitas das perguntas intermináveis "Como faço para acessar dados em meu JSON?" questões. Ele está aqui para lidar com os fundamentos gerais da decodificação de JSON em PHP e acessar os resultados.

Eu tenho o JSON:

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

Como faço para decodificar isso em PHP e acessar os dados resultantes?

Respostas

460 user3942918 Mar 28 2015 at 02:38

Introdução

Primeiro você tem uma corda. JSON não é uma matriz, um objeto ou uma estrutura de dados. JSON é um formato de serialização baseado em texto - uma string sofisticada, mas ainda apenas uma string. Decodifique-o em PHP usando json_decode().

 $data = json_decode($json);

Nele você pode encontrar:

Essas são as coisas que podem ser codificadas em JSON. Ou, mais precisamente, essas são versões do PHP das coisas que podem ser codificadas em JSON.

Não há nada de especial neles. Eles não são "objetos JSON" ou "matrizes JSON". Você decodificou o JSON - agora você tem tipos básicos de PHP diários .

Os objetos serão instâncias de stdClass , uma classe interna que é apenas uma coisa genérica que não é importante aqui.


Acessando propriedades do objeto

Você acessa as propriedades de um desses objetos da mesma forma que acessaria as propriedades públicas não estáticas de qualquer outro objeto, por exemplo $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

Acessando elementos da matriz

Você acessa os elementos de um desses arrays da mesma forma que faria para qualquer outro array, por exemplo $array[0].

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

Repita com foreach.

foreach ($toppings as $topping) {
    echo $topping, "\n";
}


Chocolate Glaceado com
Bordo Granulado

Ou mexa em qualquer uma das funções de matriz incorporadas de bazilhões .


Acessando itens aninhados

As propriedades dos objetos e os elementos dos arrays podem ser mais objetos e / ou arrays - você pode simplesmente continuar a acessar suas propriedades e membros como de costume, por exemplo $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

Passando truecomo o segundo argumento para json_decode ()

Ao fazer isso, em vez de objetos, você obterá arrays associativos - arrays com strings para chaves. Novamente você acessa os elementos da mesma como de costume, por exemplo $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

Acessando itens de matriz associativa

Ao decodificar um objeto JSON para uma matriz PHP associativa, você pode iterar tanto as chaves quanto os valores usando a foreach (array_expression as $key => $value)sintaxe, por exemplo

$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;
}

Impressões

O valor da chave 'foo' é 'foo value'
O valor da chave 'bar' é 'bar value'
O valor da chave 'baz' é 'baz value'


Não sei como os dados são estruturados

Leia a documentação para saber de onde você está obtendo o JSON.

Olhe para o JSON - onde você vê os colchetes {}esperando um objeto, onde você vê os colchetes []esperando uma matriz.

Acerte os dados decodificados com um 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);

e verifique o resultado:

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
                )

        )

)

Ele dirá onde você tem objetos, onde tem arrays, junto com os nomes e valores de seus membros.

Se você só pode ir até certo ponto antes de se perder - vá tão longe e acerte isso com print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

Dê uma olhada nele neste prático explorador JSON interativo .

Divida o problema em partes que sejam mais fáceis de entender.


json_decode() retorna null

Isso acontece porque:

  1. O JSON consiste inteiramente nisso null,.
  2. O JSON é inválido - verifique o resultado json_last_error_msgou envie -o por meio de algo como JSONLint .
  3. Ele contém elementos aninhados em mais de 512 níveis de profundidade. Esta profundidade máxima padrão pode ser substituída passando um inteiro como o terceiro argumento para json_decode().

Se você precisar alterar a profundidade máxima, provavelmente está resolvendo o problema errado. Descubra por que você está obtendo dados tão profundamente aninhados (por exemplo, o serviço que você está consultando que está gerando o JSON tem um bug) e faça com que isso não aconteça.


O nome da propriedade do objeto contém um caractere especial

Às vezes, você terá um nome de propriedade de objeto que contém algo como um hífen -ou arroba @que não pode ser usado em um identificador literal. Em vez disso, você pode usar um literal de string entre chaves para tratá-lo.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

Se você tiver um inteiro como propriedade, consulte: Como acessar as propriedades do objeto com nomes como inteiros? como referência.


Alguém colocou JSON em seu JSON

É ridículo, mas acontece - há JSON codificado como uma string dentro do seu JSON. Decodifique, acesse a string normalmente, decodifique- a e, eventualmente, obtenha o que você precisa.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

Os dados não cabem na memória

Se o seu JSON for muito grande para json_decode()ser manuseado imediatamente, as coisas começam a ficar complicadas. Vejo:


Como ordenar

Veja: Referência: todas as maneiras básicas de classificar arrays e dados em PHP .

19 MohdAbdulMujib Oct 26 2016 at 20:24

Você pode usar json_decode () para converter uma string json em um objeto / array PHP.

Por exemplo.

Entrada:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

Resultado:

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

Alguns pontos para lembrar:

  • json_decoderequer que a string seja válida, caso jsoncontrário, ela retornará NULL.
  • Em caso de falha na decodificação, json_last_error()pode ser usado para determinar a natureza exata do erro.
  • Certifique-se de passar o utf8conteúdo, ou json_decodepode errar e apenas retornar um NULLvalor.
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

Podemos decodificar string json em array usando a função json_decode em php

1) json_decode ($ json_string) // retorna o objeto

2) json_decode ($ json_string, true) // retorna a matriz

$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

Considere usar JSONPath https://packagist.org/packages/flow/jsonpath

Há uma explicação bastante clara de como usá-lo e analisar um arquivo JSON evitando todos os loops propostos. Se você está familiarizado com XPathpara XMLque você vai começar a amar esta abordagem.