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 - portanto, uma string sofisticada, mas ainda assim uma string. Decodifique-o no 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 as 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 todos os dias .
Os objetos serão instâncias do 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 maneira que faria para as propriedades não estáticas públicas 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 uma dessas matrizes da mesma maneira que faria com qualquer outra matriz, por exemplo $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Iterar sobre isso com foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Chocolate vidrado com granulado de
bordo
Ou mexa com qualquer uma das funções de matriz embutidas .
Acessando itens aninhados
As propriedades dos objetos e os elementos das matrizes podem ser mais objetos e / ou matrizes - você pode simplesmente continuar acessando 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ê obtém matrizes associativas - matrizes com strings para chaves. Novamente, você acessa os elementos dos mesmos, 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, é possível iterar chaves e 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' é 'valor da barra'
O valor da chave 'baz' é 'valor baz'
Não sei como os dados estão estruturados
Leia a documentação para o que você está obtendo o JSON.
Veja o JSON - onde você vê colchetes {}
esperando um objeto, onde você vê colchetes []
esperando uma matriz.
Bata 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 a saída:
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 lhe dirá onde você tem objetos, onde você tem matrizes, além dos nomes e valores de seus membros.
Se você só pode chegar tão longe para ele antes de se perder - ir tão longe e hit que com print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Dê uma olhada neste prático JSON Explorer interativo .
Divida o problema em pedaços mais fáceis de entender.
json_decode()
retorna null
Isso acontece porque:
- O JSON consiste inteiramente apenas disso
null
,.
- O JSON é inválido - verifique o resultado
json_last_error_msg
ou coloque-o em algo como JSONLint .
- Ele contém elementos aninhados com mais de 512 níveis de profundidade. Essa profundidade máxima padrão pode ser substituída passando um número 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á recebendo 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 sinal de arroba @
que não pode ser usado em um identificador literal. Em vez disso, você pode usar uma string literal dentro de chaves para endereçá-la.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
Se você tiver um número inteiro como propriedade, consulte: Como acessar as propriedades do objeto com nomes como números inteiros? como referência.
Alguém colocou JSON no seu JSON
É ridículo, mas acontece - há JSON codificado como uma sequência dentro do seu JSON. Decode, acesso a string como de costume, decodificação que , e, eventualmente, chegar ao 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 manipulado imediatamente, as coisas começam a ficar complicadas. Vejo:
Como classificá-lo
Veja: Referência: todas as maneiras básicas de classificar matrizes e dados em PHP .