0

我正在尝试将 twitter4j 状态对象保存到 Mongodb。我有以下代码:

public void saveTweets(Status status) throws Exception {

    BasicDBObject tweet = new BasicDBObject();
    tweet.put("tweet_id", status.getId());
    tweet.put("user", status.getUser());
    tweet.put("text", status.getText());
    tweet.put("location", status.getGeoLocation());
    tweet.put("place", status.getPlace());
    tweet.put("created_at", status.getCreatedAt());
    tweet.put("contributors", status.getContributors());
    tweet.put("hashtag_entities", status.getHashtagEntities());
    tweet.put("media_entities", status.getMediaEntities());
    tweet.put("user_mention_entities", status.getUserMentionEntities());
    tweet.put("url_entities", status.getURLEntities());
    tweet.put("source", status.getSource());
    tweet.put("retweeted_status", status.getRetweetedStatus());
    tweet.put("retweeted_count", status.getRetweetCount());
    tweet.put("count", 0);

    tweetsDAO.saveToDB(tweetsCollectionName, tweet);
}

但这引发了以下异常:

 java.lang.IllegalArgumentException: can't serialize class twitter4j.internal.json.UserJSONImpl
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
    at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
    at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
    at com.mongodb.OutMessage.putObject(OutMessage.java:289)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:239)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
    at com.mongodb.DBCollection.insert(DBCollection.java:76)
    at com.mongodb.DBCollection.insert(DBCollection.java:60)
    at com.mongodb.DBCollection.insert(DBCollection.java:105)

似乎我需要更多地进入状态对象并为返回的每个实体单独设置 BasicDBObject。但这是一项相当大的任务,因为几乎所有 status.get*** 调用都会返回另一个 twitter4j 实体,该实体具有一组字段。

有没有更好的方法来做到这一点?

谢谢。

4

2 回答 2

0

twitter4j 的状态对象有用户对象,可以通过 getUser() 访问。因此,当您尝试通过调用status.getUser()来放置用户时,您放置的是一个类而不是字符串、整数等。

您可以为您的用户调用任何方法,例如status.getUser().getId(),或者根据您的集合设计参考用户集合。

于 2013-07-21T00:12:23.683 回答
0

您可以将状态作为 JSON 字符串获取,然后将其解析为 DBObject,如下所示:

import twitter4j.json.DataObjectFactory;
import com.mongodb.util.JSON;

public void saveTweets(Status status) throws Exception {

    String tweet = DataObjectFactory.getRawJSON(status);
    DBObject doc = (DBObject)JSON.parse(tweet);

    tweetsDAO.saveToDB(tweetsCollectionName, doc);
}
于 2014-03-04T16:48:00.797 回答