2016-11-08 5 views
0

Ich habe einen Code, wie dieseLaravel PHP JSON Dekodierungs

""" 
 
HTTP/1.0 200 OK\r\n 
 
Cache-Control: no-cache\r\n 
 
Content-Type: application/json\r\n 
 
Date:   Tue, 08 Nov 2002 05:46:42 GMT\r\n 
 
\r\n 
 
{\n 
 
    "request": {\n 
 
     "body": ""\n 
 
    },\n 
 
    "response": {\n 
 
     "status": 1,\n 
 
     "users": [\n 
 
      {\n 
 
       "user_id": 1,\n 
 
       "username": "john.doe",\n 
 
       "account_status": "1",\n 
 
       "online_status": 1,\n 
 
      } 
 
     ]\n 
 
    }\n 
 
} 
 
"""

Dieser Wert stammt aus einer Datenbank sucht, das einzige Problem, das ich habe ist, dass kann ich nicht entschlüsseln es mit json_decode ... Gibt es eine Klasse oder Funktion, die dies dekodieren kann, um in array() zu konvertieren?

+0

Geben Sie den Code ein, der diese Daten zurückgibt –

+0

Wo benötigen Sie sie? Am Frontend oder Backend? – Benyi

+0

Weil das kein gültiger JSON ist. Wenn das das einzige Format ist, das du bekommen kannst, musst du es zuerst putzen und dann dekodieren. –

Antwort

1

Wie bereits in meinem Kommentar erwähnt, was Sie dort haben, ist eine ganze HTTP-Antwort. Es enthält die JSON-Daten im Hauptteil, also müssen Sie das analysieren. Hier ist eine Möglichkeit, darüber zu gehen:

preg_match("/\{(.*)\}/s", $rawResponse, $matches); 

Das paßt alles zwischen den Tannen „{“ und die letzten „}“, das ist, wo das JSON-Daten Leben und speichert jedes Spiel in $matches. Da es nur ein Spiel geben sollte, interessiert uns $matches[0].

Jetzt müssen Sie nur, sie entschlüsseln zurück:

$data = json_decode($matches[0]); 

// or 
// $data = json_decode($matches[0], true) 
// if you want an associative array instead of an object. 

Caveat: Dies wird mit Ihrem Beispiel nicht funktionieren, weil es nicht gültig JSON ist. Das Komma nach "online_status": 1, macht es ungültig, so json_decode wird false zurückgeben. Aber ich denke, Sie haben nur einige Zeilen in Ihrer Frage entfernt, um die Lesbarkeit zu verbessern.

Wenn Sie die Kontrolle darüber haben, wie die Daten gespeichert werden, sollten Sie unbedingt nur die JSON-Daten speichern, damit Sie sich nicht mit solchen Problemen befassen müssen. Wenn Sie immer noch die gesamte rohe Antwort benötigen, speichern Sie sie möglicherweise in einer anderen Tabelle/Spalte. Dies macht die Dinge viel einfacher, vor allem mit Laravel. Zum Beispiel, wenn die Daten so etwas wie ein details Feld auf einem Transaction Modell oder etwas sind, könnten Sie etwas dabei wie folgt tun:

class Transaction extends Model { 

    protected $casts = [ 
     'details' => 'json' 
    ]; 

} 

Wenn nun $transaction->details Zugriff erhalten Sie automatisch ein Array erhalten. Und das funktioniert sogar in beide Richtungen: $transaction->details = ['new' => 'data'] wird es vor dem Speichern in JSON konvertieren. Sie müssten also nicht mit dem Hin und Her konvertieren.

+0

Wirklich, er sollte den Körper ohne die Header in erster Linie bekommen, nicht versuchen, die Header nach der Tatsache abzuziehen. – Simba

+0

@Simba Genau das sage ich im zweiten Teil meiner Antwort. OP sagte, dass die Daten von einem DB kommen, also ist es schon in der gegebenen Form da. Wir wissen nicht, ob er die eingehenden Anfragen/Antworten kontrolliert oder wie die Daten gespeichert werden, aber wenn er das tut, würde das Speichern nur des relevanten Körpers natürlich mehr Sinn machen, als sich mit der Analyse auseinandersetzen zu müssen. – Quasdunk

+0

Ich habe keine Kontrolle über die Anfrage, es ist schon lange da ... Ich entziehe nur die Daten aus ihrer Datenbank. Vielen Dank für diese Antwort BTW. Das hat meine Bedenken grundsätzlich beantwortet. – Jhay