Como faço para extrair dados de JSON com PHP?
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
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:
- escalares: strings , ints , floats e bools
- nulos (um tipo especial próprio)
- tipos compostos: objetos e matrizes .
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 true
como 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:
- O JSON consiste inteiramente nisso
null
,. - O JSON é inválido - verifique o resultado
json_last_error_msg
ou envie -o por meio de algo como JSONLint . - 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 .
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_decode
requer que a string seja válida, casojson
contrá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
utf8
conteúdo, oujson_decode
pode errar e apenas retornar umNULL
valor.
// 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>";
}
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
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 XPath
para XML
que você vai começar a amar esta abordagem.