2017-06-11 2 views
0

これは私の目標です:twitter apiを使用して、ページをリロードせずに最近のつぶやきをいくつかのスライドに取り込みます。PHPでJSONを解析してJavascriptに渡すには?

私はこれを今のところ持っています。私は、JavaScriptページからphpページまで数秒ごとにajaxコールを作成しています。 phpページは、Twitterへの接続を設定および認証し、JSON形式の応答を取得します。ここで私の問題は、JSONの応答は私が得るすべてが混在し、いくつかの配列はいくつかのstdClassオブジェクトです。理想的には、このJSONをオブジェクトとしてJavascriptに直接渡したいので、Javascriptの内部で、jsonresponce-> statuses-> textのようにすることができます。

念頭に置いて、ここで同じ私が説明した構造が、コードであることを維持:

フロントエンド>

// JavaScript Document 

function AJAXToTwitter(){ 
console.log("making ajax call"); 
$.ajax({ 
    url: '../php/twiter-stream.php', 
    type: 'GET', 
    success: function(responce) { 
     $.each(responce, function(i, obj){ 
      $(".LiveSlide1 .text").html(obj.text); 
     }); 

     console.log("ajax call successful"); 
    }, 
    error: function(errors) { 
     console.log("ajax call failed"); 
    } 

}) 
} 

$(document).ready(AJAXToTwitter); 

バックエンド - >

//PHP Document 

<?php 
require "../vendor/autoload.php"; 
use Abraham\TwitterOAuth\TwitterOAuth; 

$consumerKey = "iNol________________n5uVZcAB"; 
$consumerSecret = "o_______________________l1_J"; 
$accessToken = "142480736-jlOVy___________________________________tm5b7ZN"; 
$accessTokenSecret = "K___________________________________________wF__V"; 

function getToken($apiKey, $apiKeySecret, $axToken, $axTokenSecret) { 
    $connection = new TwitterOAuth($apiKey, $apiKeySecret, $axToken, $axTokenSecret); 
return $connection; 
} 

$connection = getToken($consumerKey, $consumerSecret, $accessToken, 
$accessTokenSecret); 

$urlQuery = "#WebDesign"; 
$search = $connection->get("search/tweets", ["q" => $urlQuery]); 



echo (json_encode($search)); 

?> 

ここでの問題は、ということです私は、検索/ツイートのクエリの場合の応答はクラスだと思うので、json_encodeは文字列を生成し、$ .each関数を使用することはできません。 Chrome Dev Tools Consoleの正確なエラーには、

Uncaught TypeError: Cannot use 'in' operator to search for '70806' in 
{"statuses":[{"created_at":"Sun Jun 11 17:15:40 +0000 ....... 

と表示され、エンコードされたjson文字列全体が吐き出されます。

私の質問は、このようなAPIを扱う際にJSONを処理する適切な方法は何ですか、PHPを使用しないでJavaScriptからの直接呼び出しを行うべきですか?手動ですべてのレスポンスを抽出し、それをハンドメイドの小さなJSONでエンコードする必要がありますか?それとも、javascriptに返されていないレスポンスをそのまま渡す方法はありますか?

+0

JavaScriptの最初からJSONオブジェクトを処理するのがベストプラクティスです。方法はありますが、彼らはハッキーです。このように回避する必要があるバグはいつでも見つかるでしょう。 –

+0

@ Z.Bagley私は参照してください、しかし、PHPでそれをやってみませんか?私はむしろ簡単な、簡単なものをハッキングするのではなく、より洗練されたより複雑な方法を持っています。 –

+1

@TimAkgayev '$ .ajax'設定で' dataType: 'json''を明示的に指定してください。これにより、 'success'関数の' respondce'が確実にJavaScriptオブジェクトになります。 –

答えて

0

したがって、試行錯誤の後、私はそれを動作させました。 PHPファイルは、同じであるJavaScriptで私がこれを行う必要がありました:

$.ajax({ 
    url: '../php/twiter-stream.php', 
    type: 'GET', 
    success: function(responce) { 

     //added this line to parse the json string into JS object 
     var parsedJSON = JSON.parse(responce); 

     //now just iterating over the object to extract the info 
     $.each(parsedJSON.statuses, function(i, obj) { 

      var slideIndex = (i + 1) % 7; 
      $(".LiveSlide" + slideIndex+ " .text").html(obj.text); 
      $(".LiveSlide" + slideIndex+ " .Date").html(obj.created_at); 
     }); 


     console.log("ajax call successful"); 
    }, 
    error: function(errors) { 
     console.log("ajax call failed"); 
    } 

}) 

これは、私はそれがうまくいくと思う方法ですが、PHPの内部でTwitterOAuth ::取得()関数は、ツイッターからJSON文字列を取得しますそれをクラスにエンコードします。それをjavascriptに渡すために、そのクラスを文字列に変換する必要がありました。これはjson_encode()で行いました。 JavaScriptの内部で私はここでやったようにJSON.parse()を使ってオブジェクトに変換し直すか、@Joe Blackが提案したようにjQueryのajax呼び出しで "dataType: 'json'を指定することもできます。

関連する問題