2016-05-02 3 views
1

Nach http://www.w3schools.com/json/json_syntax.asp, JSON 'Array' ist wie folgt:JSON Array vs Objekt/Datentabellen

"employees":[ 
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"}, 
    {"firstName":"Peter","lastName":"Jones"} 
] 

Nach der gleichen Quelle, das ist ein 'Objekt' JSON:

{"firstName":"John", "lastName":"Doe"} 

ich habe eine API für meinen App entwickelt und dies ist die JSON-Antwort ich erhalte:

{ 
    "status":"success", 
    "message": [ 
     { 
      "entry_id":"1", 
      "entry_name":"12345678", 
      "entry_body":"this is just the beginning update", 
      "entry_date":"2016-05-01 08:25:51", 
      "status":"active","created_timestamp":"2016-05-01 21:25:51", 
      "updated_timestamp":null 
     }, 

     { 
      "entry_id":"2", 
      "entry_name":"one one one", 
      "entry_body":"this is just the beginning update 1", 
      "entry_date":"2016-05-02 01:44:03", 
      "status":"active", 
      "created_timestamp":"2016-05-02 14:44:03",   
      "updated_timestamp":null 
     }, 
     { 
      "entry_id":"3", 
        "entry_name":"two two two", 
        "entry_body":"this is just the beginning update 2", 
        "entry_date":"2016-05-02 01:44:13", 
        "status":"active", 
        "created_timestamp":"2016-05-02 14:44:13", 
        "updated_timestamp":null 
     } 
    ] 
} 

In DataTables- ich habe die fo gemacht llowing Skript, aber es ist nicht die JSON-Datei zu lesen:

var table = $('#list_blogs_table').DataTable({ 
    "ajax": { 
     "url": "/BlogApiV1/BlogApi/blogs", 
     "dataSrc": "message", 
    } 
    "columnDefs": 
    [ 
     { 

Meine URL muss eine GET-Methode sein, obwohl (tue ich das richtig)?

Angenommen, meine JSON-Daten werden als ARRAY betrachtet. Ist das korrekt? Ich sage Datatables, dass die Daten von "Nachricht" beginnen, indem sie "dataSrc": "message", deklarieren. Ist das korrekt?

+0

@ user3264461 was Sie sagen, ist richtig. Haben Sie in den Chrome-Entwicklungstools auf der Registerkarte "Netzwerk" nachgesehen, um sicherzustellen, dass das JSON-Element tatsächlich auf dem Frontend angezeigt wird und auf der Seite keine anderen js-Fehler vorliegen? –

+0

@lolka_bolka "Nachricht" als String ist das richtige Argument für die Option "dataSrc" – edhurtig

+0

@edhurtig mein Kommentar gelöscht, habe ich nicht erkannt, das ist ein DataTable Callback. – vaso123

Antwort

0

Um zu sehen, was Ihr Json macht, machen Sie var_dump oder var_export.

Wie lässt vermuten, Ihre Antwort in der Variablen gespeichert wird $response

$object = json_decode($response); 
var_export($object); 
var_dump($object); 

erhalten wir folgendes:

stdClass::__set_state(array(
    'status' => 'success', 
    'message' => 
    array (
    0 => 
    stdClass::__set_state(array(
     'entry_id' => '1', 
     'entry_name' => '12345678', 
     'entry_body' => 'this is just the beginning update', 
     'entry_date' => '2016-05-01 08:25:51', 
     'status' => 'active', 
     'created_timestamp' => '2016-05-01 21:25:51', 
     'updated_timestamp' => NULL, 
    )), 
    1 => 
    stdClass::__set_state(array(
     'entry_id' => '2', 
     'entry_name' => 'one one one', 
     'entry_body' => 'this is just the beginning update 1', 
     'entry_date' => '2016-05-02 01:44:03', 
     'status' => 'active', 
     'created_timestamp' => '2016-05-02 14:44:03', 
     'updated_timestamp' => NULL, 
    )), 
    2 => 
    stdClass::__set_state(array(
     'entry_id' => '3', 
     'entry_name' => 'two two two', 
     'entry_body' => 'this is just the beginning update 2', 
     'entry_date' => '2016-05-02 01:44:13', 
     'status' => 'active', 
     'created_timestamp' => '2016-05-02 14:44:13', 
     'updated_timestamp' => NULL, 
    )), 
), 
)) 


object(stdClass)#511 (2) { 
    ["status"]=> 
    string(7) "success" 
    ["message"]=> 
    array(3) { 
    [0]=> 
    object(stdClass)#512 (7) { 
     ["entry_id"]=> 
     string(1) "1" 
     ["entry_name"]=> 
     string(8) "12345678" 
     ["entry_body"]=> 
     string(33) "this is just the beginning update" 
     ["entry_date"]=> 
     string(19) "2016-05-01 08:25:51" 
     ["status"]=> 
     string(6) "active" 
     ["created_timestamp"]=> 
     string(19) "2016-05-01 21:25:51" 
     ["updated_timestamp"]=> 
     NULL 
    } 
    [1]=> 
    object(stdClass)#513 (7) { 
     ["entry_id"]=> 
     string(1) "2" 
     ["entry_name"]=> 
     string(11) "one one one" 
     ["entry_body"]=> 
     string(35) "this is just the beginning update 1" 
     ["entry_date"]=> 
     string(19) "2016-05-02 01:44:03" 
     ["status"]=> 
     string(6) "active" 
     ["created_timestamp"]=> 
     string(19) "2016-05-02 14:44:03" 
     ["updated_timestamp"]=> 
     NULL 
    } 
    [2]=> 
    object(stdClass)#514 (7) { 
     ["entry_id"]=> 
     string(1) "3" 
     ["entry_name"]=> 
     string(11) "two two two" 
     ["entry_body"]=> 
     string(35) "this is just the beginning update 2" 
     ["entry_date"]=> 
     string(19) "2016-05-02 01:44:13" 
     ["status"]=> 
     string(6) "active" 
     ["created_timestamp"]=> 
     string(19) "2016-05-02 14:44:13" 
     ["updated_timestamp"]=> 
     NULL 
    } 
    } 
} 

Wie Sie sehen können, Ihre Struktur löst zu einem Objekt, das ist ein assoziatives Array das ein Array enthält, das ein Objekt enthält, das ein assocaitve-Array ist;

Dies bedeutet, dass Sie nicht als assoziatives Array zugreifen können.

so das Objekt $ [ 'message'] wird nicht funktionieren, aber $ object-> Nachricht arbeiten :-)

var_dump($var->message[0]) 

zu

object(stdClass)#512 (7) { 
    ["entry_id"]=> 
    string(1) "1" 
    ["entry_name"]=> 
    string(8) "12345678" 
    ["entry_body"]=> 
    string(33) "this is just the beginning update" 
    ["entry_date"]=> 
    string(19) "2016-05-01 08:25:51" 
    ["status"]=> 
    string(6) "active" 
    ["created_timestamp"]=> 
    string(19) "2016-05-01 21:25:51" 
    ["updated_timestamp"]=> 
    NULL 
} 

löst man es wie folgt zugreifen können: -)

$myobj = $var->message[0] 

echo $myobj->status == 'active' 

in Javascript es sein würde,

var obj = JSON.parse(message); 
myobj = obj.message[0]; 
echo myobj.status == 'active'; 

Wenn Sie überschreiben jQuerys ajax Sie anrufen können sehen, dass der folgende Aufruf an den Server gesendet wird (den Code von meinem Snippet für sehen, wie diese sehen)

Wie Sie Ihre Argumente geschickt bekommen sehen, wie zusätzliche Argumente für den Server.

[Object] 0: Object Cache: false Daten: Object DATASRC: "message" Datentyp: "json" Fehler: (b, c) success: (b) Typ: „GET " url: "/ BlogApiV1/BlogApi/blogs"

und Ihre ajax-Antwort sollte wie folgt aussehen:

{ 
    "status":"success", 
    "data": [ 
     [ 
      "1", 
      "12345678", 
      "this is just the beginning update", 
      "2016-05-01 08:25:51", 
      "active", 
      "2016-05-01 21:25:51", 
      null 
     ], 
     [ 
      "2", 
      "one one one", 
      "this is just the beginning update 1", 
      "2016-05-02 01:44:03", 
      "active", 
      "2016-05-02 14:44:03", 
      null 
      ], 
     [ 
      "3", 
      "two two two", 
      "this is just the beginning update 2", 
      "2016-05-02 01:44:13", 
      "active", 
      "2016-05-02 14:44:13", 
      null 
     ] 
    ] 
} 

entnehmen Sie bitte den Datentabellen Beispiele Seiten und schau dir die Source-Tabs unten an :-) sie geben Beispiele, wie sie erwarten, dass sie formatiert werden :-)

+0

Obwohl dies eine großartige Erklärung für die Interaktion mit JSON in PHP ist, scheint es, als ob die Frage hauptsächlich auf Probleme mit DataTables (JS) gerichtet ist. Aber wieder, sehr nützliche Antwort, und @ user3264461 könnte mich in diesem Fall falsch finden:) – edhurtig

+0

Nun, es wurde markiert PHP, so nahm ich an, eine PHP-Erklärung könnte auch gültig sein, um ihm zu helfen, die Struktur zu verstehen. Ich füge auch eine Javascript-Erklärung hinzu – Tschallacka

+1

Cool nur gedacht, ich würde darauf hinweisen:). Ich wette, die Erklärung von JS wird auch sehr hilfreich sein! – edhurtig

1

Dein JSON enthält mehrere versteckte illegale Steuerzeichen, es scheint Escape- und ungültige Tabs zu geben. Auch wenn Ihr JSON als lokal definiertes Literal funktionieren würde, wird es fehlschlagen, wenn es über ein Netzwerk und JSonified auf dem Client übergeben wird.

In Zukunft können Sie https://jsonformatter.curiousconcept.com verwenden, um genau zu sehen, was mit dem JSON nicht stimmt. Sie können auch https://myjson.com zur Validierung verwenden, da es JSON.parse() verwendet, nicht ein algorithmischer Test wie http://jsonlint.com die Ihre JSON als gültig betrachten würde falsy.

So einfach Bereinigung der JSON und es funktioniert:

var table = $('#example').DataTable({ 
    ajax: { 
    url: "https://api.myjson.com/bins/14lrs", 
    dataSrc: "message", 
    }, 
    columnDefs: [ 
    { targets: 0, data: 'entry_id' }, 
    { targets: 1, data: 'entry_name' } 
    ] 
}) 

Demo ->http://jsfiddle.net/3wr2j2yx/

Versuchen Sie, die gereinigt JSON von http://myjson.com/14lrs greifen und dass stattdessen als Quelle verwenden.

My URL must be a GET method though (am I doing that correctly)?

Ja!

Also, assume my JSON data is considered an ARRAY. Is that correct? I tell datatables that the data starts from 'message' by declaring "dataSrc": "message",. Is that correct?

Ja!

+0

Vielen Dank für die Bereitstellung so vieler Details. Tatsächlich hatte ich "columnDefs" an der falschen Stelle platziert. Sortierte das jetzt. Ich bekomme jetzt den folgenden Fehler: DataTables Warnung: Tabelle ID = List_blogs_table - Angefordert unbekannter Parameter '0' für Zeile 0. Ich änderte die URL zu http://myjson.com/14lrs und erhalten den gleichen Fehler. Ging durch meine jQuery und HTML und alles sieht auch korrekt aus. – user3264461

+0

BTW, ich bemerkte auch "update_timestamp" wurde auf "" ist Ihr Beispiel und NULL in meinem. Ich habe alle Einträge auf das aktuelle Datum geändert, aber kein Glück. – user3264461

+0

BTW, ich rane meinen JSON durch die Links, die Sie angegeben haben, und es sagt, dass mein JSON gültig ist. Wie hast du die Escape- und ungültigen Tabs gefunden? Warum sollte es auch lokal funktionieren? Eigentlich sind sowohl der API-Server als auch der Client lokal und es wird kein FQD verwendet (denke ich). – user3264461

0

Haben Sie die Probleme aussortiert. Die Lösung bestand in der Korrektur der JSON-Ausgabe nach @ Michael-Dibbets großem Durchbruch. Ich benutze den REST-Server von Phil Sturgeon, um die API zu erstellen. Der Standardwert scheint JSON-Ausgabe zu sein, jedoch ist, wie Michael-Dibbets aufgezeigt hat, der JSON nicht gültig. Der REST-Server erlaubt Formate, einschließlich xml, csv, usw., usw. Anstatt sich auf den Standard zu verlassen, habe ich das Format in der URL wie/BlogApiV1/BlogApi/blogs/format/json angegeben und dies alles behoben. Vielen Dank für die Kommentare und sicherlich viel gelernt von dem Fehler.