2009-09-25 3 views
9

Mam następujący JSON:Dostęp JSON nazwa obiektu w PHP

{"nickname":"xadoc","level":4,"loc":"Tulsa, OK, USA","score":122597,"money":29412.5,"streetNum":8,"streets":{"-91607259\/387798111":{"name":"Alam\u00e9da Ant\u00f3nio S\u00e9rgio","value":243,"type":1},"-91016823\/388182402":{"name":"Autoestrada do Norte","value":18304,"type":1},"-86897820\/399032795":{"name":"Autoestrada do Norte","value":12673,"type":1},"-973092846\/479475465":{"name":"19th Ave","value":7794,"type":1},"-974473223\/480054888":{"name":"23rd Ave NE","value":33977,"type":1}}} 

ja rozpaczliwie próbuje uzyskać dostęp do nazwy obiektów dynamicznych jak "-91607259\/387798111", w jaki sposób mogę to zrobić?

Teraz mam:

$jsonurl = "http://www.monopolycitystreets.com/player/stats?nickname=$username&page=1"; 
$json = file_get_contents($jsonurl,0,null, $obj2 = json_decode($json); 

foreach ($obj2->streets as $street) 
{ 
    //Here I want to print the "-91607259\/387798111" for each street, please help 
    //echo $street[0]; gives "Fatal error: Cannot use object of type stdClass as array" 
    //echo $street gives "Catchable fatal error: Object of class stdClass could not be converted to string" 
    echo '<th>'.$street->name.'</th><td>'."M ".number_format($street->value, 3, ',', ',').'</td>'; 
} 

Odpowiedz

14

Mogę sobie wyobrazić, że najprostszą rzeczą do zrobienia jest do dekodowania w tablicach asocjacyjnych zamiast stdClass obiektów

$obj2 = json_decode($json, true); 

foreach ($obj2['streets'] as $coords => $street) 
{ 
    echo $coords; 
} 
+0

Używanie tablic asocjacyjnych "json_decode ($ json, true);" dał mi ten błąd "Ostrzeżenie: podano niepoprawny argument dla foreach()", ale "foreach ($ obj2-> streets as $ coords => $ street)" działał jak czar! : D Dziękuję bardzo! Również dzięki Gumbo do edycji kodu. Stackoverflow jest naprawdę świetny! – xadoc

+0

Haha, zasugerowałem przejście na tablice asocjacyjne i natychmiast zapomniałem użyć tej składni w moim fragmencie. Odpowiedź zaktualizowana. Dzięki za połów;) –

0

nie mogę spróbować teraz, ale jeśli zrobić:

var_dump($obj2); 

powinieneś być w stanie zobaczyć dokładnie, jak uzyskać dostęp do informacji .

+0

także z Firebug masz naprawdę piękny JSON „Explorer”, gdzie można zobaczyć i poruszać się po cała struktura i dane. – xadoc

11

Biorąc pod uwagę ten kawałek kodu:

$json = '{"nickname":"xadoc","level":4,"loc":"Tulsa, OK, USA","score":122597,"money":29412.5,"streetNum":8,"streets":{"-91607259\/387798111":{"name":"Alam\u00e9da Ant\u00f3nio S\u00e9rgio","value":243,"type":1},"-91016823\/388182402":{"name":"Autoestrada do Norte","value":18304,"type":1},"-86897820\/399032795":{"name":"Autoestrada do Norte","value":12673,"type":1},"-973092846\/479475465":{"name":"19th Ave","value":7794,"type":1},"-974473223\/480054888":{"name":"23rd Ave NE","value":33977,"type":1}}}'; 
$obj2 = json_decode($json); 
var_dump($obj2); 

dostaniesz:

object(stdClass)[1] 
    public 'nickname' => string 'xadoc' (length=5) 
    public 'level' => int 4 
    public 'loc' => string 'Tulsa, OK, USA' (length=14) 
    public 'score' => int 122597 
    public 'money' => float 29412.5 
    public 'streetNum' => int 8 
    public 'streets' => 
    object(stdClass)[2] 
     public '-91607259/387798111' => 
     object(stdClass)[3] 
      public 'name' => string 'Alaméda António Sérgio' (length=25) 
      public 'value' => int 243 
      public 'type' => int 1 
     public '-91016823/388182402' => 
     object(stdClass)[4] 
      public 'name' => string 'Autoestrada do Norte' (length=20) 
      public 'value' => int 18304 
      public 'type' => int 1 
     public '-86897820/399032795' => 
     object(stdClass)[5] 
      public 'name' => string 'Autoestrada do Norte' (length=20) 
      public 'value' => int 12673 
      public 'type' => int 1 
     public '-973092846/479475465' => 
     object(stdClass)[6] 
      public 'name' => string '19th Ave' (length=8) 
      public 'value' => int 7794 
      public 'type' => int 1 
     public '-974473223/480054888' => 
     object(stdClass)[7] 
      public 'name' => string '23rd Ave NE' (length=11) 
      public 'value' => int 33977 
      public 'type' => int 1 

Czyli można pętli na ulicach tak:

foreach ($obj2->streets as $id => $street) { 
    echo $id; 
    var_dump($street); 
    echo '<hr />'; 
} 

z tym, dla każdego $street, otrzymasz odpowiedni klucz do $id - a dane do $street.


Albo można bezpośrednio uzyskać dostęp do jednej w ten sposób:

$street = $obj2->streets->{'-86897820/399032795'}; 
var_dump($street); 

Który będzie Ci:

object(stdClass)[5] 
    public 'name' => string 'Autoestrada do Norte' (length=20) 
    public 'value' => int 12673 
    public 'type' => int 1 


Twój $obj2->street jest obiektem, co oznacza, że ​​nie można korzystać z tablicy-składni dostęp; To wyjaśnia „Fatal error: Cannot use object of type stdClass as array” jeśli spróbujesz użyć tego:

$obj2->streets['-86897820/399032795']; 

Ale właściwości Twojego obiektu mają dość „dziwne” imiona; co oznacza, że ​​nie może tego zrobić:

$obj2->streets->-86897820/399032795; 

Który daje Parse error: syntax error, unexpected '-', expecting T_STRING or T_VARIABLE or '{' or '$'

ani że:

$obj2->streets->'-86897820/399032795'; 

co także daje Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting T_STRING or T_VARIABLE or '{' or '$'

Na szczęście, można użyć {} do rodzaju „ochrony "nazwa kluczy i spraw, aby wszystko działało ;-)
(Nie mogę znaleźć strony w instrukcji, która wyjaśnia tę składnię ani jej nazwy ... Jeśli ktoś wie ...)

+0

Foreach ($ obj2-> streets jako $ id => $ street) było brakującym elementem. Dziękuję za pomoc i wyjaśnienie! – xadoc

+0

dziękuję bardzo, że zadziałało dla mnie ... –