2016-07-27 11 views
0

Ich versuche etwas zu tun, das ich schon oft gemacht habe (Zugriff auf Objekte in einer JSON-Datei mit PHP) und aus irgendeinem Grund gibt json_decode nur das letzte Element im JSON-Array zurück. Hier ist die JSON:PHP nur zurückkehrendes letztes JSON-Objekt

{ 
    "person": { 
    "lname": "smith", 
    "fname": "bob" 
    }, 
    "person": { 
    "lname": "jones", 
    "fname": "jane" 
    } 
} 

Und die PHP:

<?php 

//access and dump 
$json = file_get_contents('people.json'); 
$filey = json_decode($json, true); 

var_dump($filey); 

?> 

Das Ergebnis ist nur das letzte Element im Array:

array (size=1) 
    'person' => 
    array (size=2) 
     'lname' => string 'jones' (length=5) 
     'fname' => string 'jane' (length=4) 

Mit json_last_error kehrt keine Fehler und ich bin gültig nach jsonlint. Ich finde auch keine Konsolenfehler, wenn ich die Seite lade.

Ich bin völlig ratlos und kann nichts anderes als die Zeiten sehen, die ich schon mal gemacht habe - kann jemand identifizieren, was ich hier vermisse?

+3

Ihr Schlüssel ist die gleiche 'Person' so wird es überschrieben – Saurabh

+1

beachten Sie, dass Schlüssel/Eigenschaften eindeutig sein müssen – Ghost

+1

Ihre Indizes sind gleich und deshalb ist es überschrieben (' person') –

Antwort

2

Das liegt daran, dass Ihre json-Objektnamen "person" innerhalb von json array ähnlich sind, sodass json decode die Werte mit den neuesten überschreiben wird. Betrachten wir so etwas wie

{ 
    "person1": { 
    "lname": "smith", 
    "fname": "bob" 
    }, 
    "person2": { 
    "lname": "jones", 
    "fname": "jane" 
    } 
} 

und Ihr Code wird funktionieren.

+0

Nun, das ist peinlich - in der Vergangenheit habe ich keine Objektnamen verwendet und deshalb habe ich nie realisiert, dass sie einzigartig sein müssen. Danke für Ihre Hilfe. – Marcatectura

0

Wenn Sie json_decode(true) verwenden, ist Ihr JSON jetzt ein Array. Sie können nicht zwei Array-Schlüssel haben, die identisch sind, in diesem Fall "Person".

Wenn Sie immer noch json_decode(true) verwenden möchten, ändern Sie "person" in "person1" oder so.

Probieren Sie var_dump($filey) und var_dump($json), Sie werden sehen, worüber ich spreche.

1

Marcatectura, ich weiß, dass Sie bereits die Antwort akzeptiert haben, die die Verwendung verschiedener Objektschlüssel vorschlägt, aber ich dachte, Sie sollten es wissen. Wenn Sie ein Array in PHP wollen, brauchen Sie nicht einmal Objektnamen. Die folgende JSON tun:

[ 
    { 
     "lname": "Dawes", 
     "fname": "April" 
    }, 
    { 
     "lname": "Colin", 
     "fname": "Dick" 
    } 
] 

Ein Trick, den ich benutze, wenn ich bin die Gestaltung meiner JSON ist ein Beispiel PHP-Array in der Form, die ich json_decode mir geben will zu bauen, kodieren, das Array und das Ergebnis auszugeben zu screenen . Also, was ich oben geschrieben ist das Ergebnis:

$arr = [ 
    ['lname'=>'Dawes','fname'=>'April'],['lname'=>'Colin','fname'=>'Dick'], 
]; 
$json = json_encode($arr); 
echo $json; 

Da ich eine JSON gebaut durch ein Array kodiert, die Form, die ich will, ich sicher sein, dass sogar meine Daten ändern, json_decode($json,true) gibt mir die Array-Form Ich erwarte.

Glückliche Kodierung.