将twitter4j Status对象保存到MongoDB

时间:2013-07-20 08:33:22

标签: java mongodb serialization twitter twitter4j

我正在尝试将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实体。

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

感谢。

2 个答案:

答案 0 :(得分:0)

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

您可以为您的用户调用任何方法,例如 status.getUser()。getId(),或根据您的收藏品设计引用用户收藏。

答案 1 :(得分: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);
}