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 回答