2016-05-02 1 views
1

Selon http://www.w3schools.com/json/json_syntax.asp, un 'tableau' JSON est comme ceci:JSON tableau vs objet/datatables

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

Selon la même source, c'est un 'objet' JSON:

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

J'ai développé une API pour mon application et ceci est la réponse JSON Je reçois:

{ 
    "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 
     } 
    ] 
} 

en datatables, je l'ai fait la fo script llowing mais il ne lit pas le fichier JSON:

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

Mon URL doit être une méthode GET si (ce que je fais que correctement)?

En outre, supposons que mes données JSON sont considérées comme un ARRAY. Est-ce exact? Je dis aux datatables que les données commencent à partir de «message» en déclarant "dataSrc": "message",. Est-ce exact?

+0

@ user3264461 Ce que vous dites est correct. avez-vous regardé dans l'onglet Réseau sur Chrome Dev Tools pour vous assurer que ce JSON est ce que vous obtenez réellement sur le frontend et que vous n'avez pas d'autres erreurs js sur la page? –

+0

@lolka_bolka "message" en tant que chaîne est l'argument correct pour l'option "dataSrc" – edhurtig

+0

@edhurtig supprimé mon commentaire, je n'ai pas réalisé, c'est un rappel DataTable. – vaso123

Répondre

0

Pour voir ce que votre json devient do var_dump ou var_export.

Comme laisse supposer votre réponse est stockée dans la variable $response

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

nous obtenons les éléments suivants:

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 
    } 
    } 
} 

Comme vous pouvez le voir, la structure résout à un objet, qui est un tableau associatif qui contient un tableau qui contient un objet qui est un tableau assocaitve; Cela signifie que vous ne pouvez pas accéder en tant que tableau associatif.

donc $ object [ 'message'] ne fonctionnera pas, mais $ object-> message :-) travail

var_dump($var->message[0]) 

décide de

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 
} 

vous pouvez y accéder comme ceci: -)

$myobj = $var->message[0] 

echo $myobj->status == 'active' 

en javascript, il serait,

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

Si vous écrasez, vous pouvez voir l'appel de jquery ajax que l'appel suivant est envoyé à votre serveur (voir le code de mon extrait pour savoir comment voir ceci)

Comme vous pouvez voir vos arguments sont envoyés comme arguments supplémentaires au serveur.

[Objet] 0: Objet cache: false data: Object dataSrc: "message" dataType: "JSON" erreur: (b, c) succès: (b) Type : « GET " url: "/ BlogApiV1/blogapi/blogs"

et votre réponse ajax devrait ressembler à ceci:

{ 
    "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 
     ] 
    ] 
} 

S'il vous plaît se référer aux exemples de pages et DataTables consultez les onglets sources en bas :-) ils donnent des exemples comment ils s'attendent à ce que les choses soient formatées :-)

+0

Bien que ce soit une excellente explication de l'interaction avec JSON en PHP, il semble que la question soit largement orientée vers des problèmes avec DataTables (JS). Mais encore une fois, la réponse très utile, et @ user3264461 pourrait me trouver dans ce cas:) – edhurtig

+0

Eh bien, il a été étiqueté php, donc j'ai supposé une explication php pourrait être valide aussi pour l'aider à comprendre la structure. Je vais ajouter une explication javascript aussi – Tschallacka

+1

Cool juste pensé que je le ferais remarquer:). Je parie que l'explication de JS sera également très utile! – edhurtig

1

Votre JSON inclut plusieurs caractères cachés de contrôle illégal, il semble qu'il s'agisse d'échappement et d'onglets invalides. Même si votre JSON fonctionne comme un littéral défini localement, il échouera lorsqu'il sera transmis sur un réseau et JSONified sur le client.

À l'avenir, vous pouvez utiliser https://jsonformatter.curiousconcept.com pour voir exactement ce qui ne va pas avec le JSON. Vous pouvez utiliser https://myjson.com pour valider aussi, car il utilise JSON.parse(), pas un test algorithmique comme http://jsonlint.com qui considérerait que votre JSON est valide.

donc simplement nettoyer le JSON et cela fonctionne:

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' } 
    ] 
}) 

Démo ->http://jsfiddle.net/3wr2j2yx/

Essayez saisir le JSON nettoyé de http://myjson.com/14lrs et l'utiliser comme source au lieu.

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

Oui!

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?

Oui!

+0

Merci de fournir autant de détails. En effet, j'avais placé "columnDefs" au mauvais endroit. Trié ça maintenant. Je reçois maintenant l'erreur suivante: Avertissement DataTables: id de table = liste_blogs_table - Requis paramètre inconnu '0' pour la ligne 0. J'ai changé l'URL à http://myjson.com/14lrs et obtenir la même erreur. Je suis passé par ma jquery et html et tout semble correct aussi. – user3264461

+0

BTW, j'ai également remarqué "update_timestamp" a été mis à "" est votre exemple et NULL dans le mien. J'ai changé toutes les entrées à la date/heure actuelle mais pas de chance. – user3264461

+0

BTW, je raster mon json à travers les liens que vous avez fournis et il est dit que mon JSON est valide. Comment avez-vous trouvé les échappements et les onglets invalides? Aussi, pourquoi cela fonctionnerait-il localement? En fait, le serveur API et le client sont locaux et aucun FQD n'est utilisé (je pense). – user3264461

0

Ont réglé les problèmes. La solution consistait à corriger la sortie JSON par la grande panne de Michael-Dibbets. J'utilise en fait le serveur REST de Phil Sturgeon pour aider à créer l'API. La valeur par défaut semble être la sortie JSON, cependant, encore une fois, comme l'a souligné Michael-Dibbets, le JSON n'est pas valide. Le serveur REST permet les formats, y compris xml, csv, etc, etc. Plutôt que de s'appuyer sur la valeur par défaut, j'ai spécifiquement indiqué le format dans l'URL comme/BlogApiV1/BlogApi/blogs/format/json et tout cela. Merci pour les commentaires de tout le monde et certainement beaucoup appris de l'erreur.