json_decode para matriz

422

Estou tentando decodificar uma string JSON em uma matriz, mas recebo o seguinte erro.

Erro fatal: não é possível usar o objeto do tipo stdClass como matriz em C: \ wamp \ www \ temp \ asklaila.php na linha 6

Aqui está o código:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>
Harsha MV
fonte
1
Teria funcionado se você acessasse com $ob->Resultele.
Lapin

Respostas:

839

De acordo com a documentação , você precisa especificar se deseja uma matriz associativa em vez de um objeto json_decode; este seria o código:

json_decode($jsondata, true);
Stephen
fonte
4
Ele levanta a questão: quais são as vantagens de retornar como uma matriz e não como um objeto?
precisa saber é
52
Isso levanta a questão. "Fazer uma pergunta" significa assumir algo que ainda precisa ser provado ( ref ). Em ambos os casos, a vantagem pode ser que o OP é mais confortável ao atravessar matrizes do que objetos ou que algum outro código já implementado exija uma matriz.
Jamesnotjim
8
@jamesnotjim A implementação padrão que retorna um objeto pode implantar a pergunta de que os objetos têm valores de retorno melhores que as matrizes, não é?
David Mann
7
Na verdade, poderia @DavidMann. Touché!
jamesnotjim
8
Eu acrescentaria o comentário (embora anos depois) de que não há possibilidade de o JSON conter nada além de dados, tornando essa uma opção "padrão" confusa.
Barry
45

tente isso

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);
diEcho
fonte
27

Essa é uma contribuição tardia, mas há um caso válido para transmissão json_decodecom (array).
Considere o seguinte:

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Se $jsondataalguma vez for retornado como uma sequência vazia (como na minha experiência, geralmente), json_decoderetornará NULL, resultando no erro Aviso: Argumento inválido fornecido para foreach () na linha 3 . Você pode adicionar uma linha de código if / then ou um operador ternário, mas na IMO é mais fácil alterar a linha 2 para ...

$arr = (array) json_decode($jsondata,true);

... a menos que você esteja json_decodeproduzindo milhões de matrizes grandes de uma só vez, caso em que @ TCB13 aponta, o desempenho pode ser afetado negativamente.

neokio
fonte
6

De acordo com a função de documentação do PHPjson_decode , tem um parâmetro chamado assoc que converte os objetos retornados em matrizes associativas

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

Como o parâmetro assoc é FALSEpor padrão, você deve definir esse valor TRUEpara recuperar uma matriz.

Examine o código abaixo para obter um exemplo de implicação:

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

quais saídas:

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)
}
Arosha De Silva
fonte
5

Isso também mudará para uma matriz:

<?php
    print_r((array) json_decode($object));
?>
coreyavis
fonte
6
Este um desperdício de CPU / memória, como sugere json_decode($object, true);o truefaz exatamente o mesmo, internamente muito mais rápido.
TCB13
1
@ TCB13 exceto se precisar de ambos e não quer correr decodificação novamente
Jimmy Kane
3
Concorde com @JimmyKane. Eu tentei e executei as duas versões em um ciclo; se você precisar de objeto e matriz (embora isso aconteça raramente?), json_decode+ a conversão é 45% mais rápida do que a execução dos dois tipos de json_decode. Por outro lado, ambos são tão rápidos que, a menos que você precise literalmente de milhares de decodificações, a diferença é insignificante.
LSerni
4

json_decodeapoiar o segundo argumento, quando definido TRUE, retornará um em Arrayvez de stdClass Object. Verifique a página da função Manualjson_decode para ver todos os argumentos suportados e seus detalhes.

Por exemplo, tente o seguinte:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!
Arjun Kariyadan
fonte
3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Portanto, se você deseja uma matriz, pode passar o segundo argumento como 'true' na json_decodefunção.

Shanu Singh
fonte
3

Eu espero que isso te ajude

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Use a função de decodificação Json

$json_pss = json_decode($json_ps, true);

Looping sobre matriz JSON em php

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

Resultado : Sistemas de Computação (Redes)

TechyFlick
fonte
2

no PHP json_decode converte dados json em array associado ao PHP
Para Ex:$php-array= json_decode($json-data, true); print_r($php-array);

Salman Mohammad
fonte
2

Por favor tente isto

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>
Dipali Sakle Systematix
fonte
2

Tente assim:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
lalithkumar
fonte