Pretende-se que seja uma pergunta e resposta de referência geral, cobrindo muitos dos intermináveis "Como acesso dados no meu JSON?" questões. Ele está aqui para lidar com os conceitos básicos gerais de 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 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 - portanto, uma string sofisticada, mas ainda assim uma string. Decodifique-o no PHP usando
json_decode()
.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
.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]
.Iterar sobre isso com
foreach
.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
.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']
.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,Impressões
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()
:e verifique a saída:
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()
:Dê uma olhada neste prático JSON Explorer interativo .
Divida o problema em pedaços mais fáceis de entender.
json_decode()
retornanull
Isso acontece porque:
null
,.json_last_error_msg
ou coloque-o em algo como JSONLint .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.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.
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 .
fonte
Você pode usar json_decode () para converter uma string json em um objeto / matriz PHP.
Por exemplo.
Entrada:
Resultado:
Alguns pontos a serem lembrados:
json_decode
requer que a sequência seja válida, casojson
contrário ela retornaráNULL
.json_last_error()
pode ser usado para determinar a natureza exata do erro.utf8
conteúdo oujson_decode
pode errar e retornar umNULL
valor.fonte
fonte
Podemos decodificar json string em array usando a função json_decode no php
1) json_decode ($ json_string) // retorna o objeto
2) json_decode ($ json_string, true) // retorna o array
fonte
Considere usar
JSONPath
https://packagist.org/packages/flow/jsonpathHá 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
paraXML
que você vai começar a amar esta abordagem.fonte
Eu escrevi um pacote chamado
JSON
( GitHub , Packagist ). Se você deseja evitar sobrecargas no uso dejson_*
funções, tente.Exemplo
Veja o wiki ou o tutorial rápido para se familiarizar com ele.
Além disso, se você quiser ler arquivos JSON e extrair seus dados (como parece que você está tentando fazer isso), consulte JSONFile pacote , que eu escrevi também.
fonte
https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w
Verifique o código abaixo para converter json em array
PHP
. Se o JSON estiver correto, elejson_decode()
funcionará bem e retornará uma matriz. Mas, se o JSON estiver mal formado, ele retornaráNULL
,Se JSON malformado e você estiver esperando apenas uma matriz, poderá usar esta função,
Se JSON malformado e você desejar interromper a execução do código, poderá usar esta função,
Você pode usar qualquer função depende de sua exigência,
fonte