1

Twitter の検索結果を JSON オブジェクトとして結果ページに書き込むアプリケーションを開発しました。

for (Status tweet : tweets) {
    Map<String, String> tweetResult = new LinkedHashMap<String, String>();
    tweetResult.put("username", tweet.getUser().getScreenName());
    tweetResult.put("status", tweet.getText());
    tweetResult.put("date", tweet.getCreatedAt().toString());
    tweetResult.put("retweets", String.valueOf(tweet.getRetweetCount()));
    String resultJson = new Gson().toJson(tweetResult);
    response.getWriter().write(resultJson);
}

これは、次の AJAX/JQuery で呼び出されます。

$(document).ready(function() {                                                                      
    $.getJSON('SearchServlet', function(list) {
        var table = $('#resultsTable');
        $.each(list, function(index, tweet) {
        $('<tr>').appendTo(table)
                .append($('<td>').text(tweet.username))
                .append($('<td>').text(tweet.status))
                .append($('<td>').text(tweet.date))
                .append($('<td>').text(tweet.retweets));
        });
    });
});

テーブルに結果を入力する目的で:

<body>
    <div id="wrapper">      
        <div id="contentArea">
            <div id="content">
                <h2>Results:</h2>
                <table id="resultsTable"></table>
            </div>
        </div>
    </div>
</body>

GET 呼び出しは完全に機能しており、結果は問題なく firebug コンソールに表示されますが、実際のドキュメント自体には意図したとおりに表示されません。私はこれに対してさまざまなアプローチを試みました(ここここの回答を含む)。

JSON 出力の例:

{"username":"Dineen_","status":"RT @TwitterAds: Learn how to put Twitter to work for your small business! Download our small biz guide now: https://t.co/gdnMMYLI","date":"Tue Feb 26 08:37:11 GMT 2013","retweets":"22"}

前もって感謝します。

4

2 に答える 2

4

シリアル化が間違っているようです。配列に適切に囲まれていない連結されたJSONオブジェクトのシーケンスを生成しているため。

現在無効なJSON応答:

{ ... } { ... } { ... } { ... }

予想されるJSON応答は次のようになります。

[ { ... }, { ... }, { ... }, { ... } ]

手作業でこれを行う必要はありません。適切なオブジェクトを作成すると、Gsonが自動的にそれを行う場合があります。たとえば、次のように使用します(テストされていません)。

List<Map<String, String>> tweetList = new LinkedList<Map<String, String>>();
for (Status tweet : tweets) {
    Map<String, String> tweetResult = new LinkedHashMap<String, String>();
    tweetResult.put("username", tweet.getUser().getScreenName());
    tweetResult.put("status", tweet.getText());
    tweetResult.put("date", tweet.getCreatedAt().toString());
    tweetResult.put("retweets", String.valueOf(tweet.getRetweetCount()));
    tweetList.add(tweetResult);
}
String resultJson = new Gson().toJson(tweetList);
response.getWriter().write(resultJson);

この修正後、元のコードを使用できるようになります。


JSON出力の例に基づくと、返される出力は配列ではなくオブジェクトです。ここで使用する必要はありません$.each

$(document).ready(function () {
    $.getJSON('SearchServlet', function(tweet) {
        var table = $('#resultsTable');
        $('<tr>').appendTo(table)
                 .append($('<td>').text(tweet.username))
                 .append($('<td>').text(tweet.status))
                 .append($('<td>').text(tweet.date))
                 .append($('<td>').text(tweet.retweets));
    });
});
于 2013-02-26T18:07:03.837 に答える
2

問題はの使用にあると思います$.each。オブジェクトを渡すので、オブジェクトeachのキーと値のペアを繰り返し処理しています。(http://api.jquery.com/jQuery.each/を参照)

角かっこで囲まれたJSONオブジェクトを返したい場合は、配列を反復処理します。

[{"username":"Dineen_","status":"RT @TwitterAds: Learn how to put Twitter to work for your small business! Download our small biz guide now: https://t.co/gdnMMYLI","date":"Tue Feb 26 08:37:11 GMT 2013","retweets":"22"}]

編集:アレクサンダーが指摘しているように、あなたはすでに行っているのと同じオブジェクトを返すことができますが、$.eachまったく使用しないでください。私の答えは、いくつかのオブジェクトを返し、すべてをテーブル行に挿入できるようにすることを前提としています。

于 2013-02-26T18:07:33.840 に答える