2013-07-20 88 views
0

我试图将twitter4j状态对象保存到Mongodb。我有以下代码:将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 ***调用都返回另一个具有feild的twitter4j实体,这是一项相当大的任务。

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

谢谢。

+0

u能张贴上面的堆栈跟踪? – rahulserver

+0

增加了stacktrace。 – popcoder

+0

它是完整的堆栈跟踪吗?它不包含错误发生的确切位置。它很难从上面看出跟踪是什么导致异常, – rahulserver

回答

0

twitter4j的Status对象有User对象,可以通过getUser()方法访问。所以,当你尝试通过调用status.getUser把用户(),你把一个类,而不是一个字符串,整数或等

你可以调用任何方法对你的用户喜欢status.getUser()。 getId(),或根据您的集合设计引用用户集合。

+0

我已经提到了原因......它是直接的...... :)我只是想知道一个更好的方式来直接保存这些对象,而不需要将每个字段都输出...... – popcoder

+0

然后,您可以尝试吗啡库。 https://code.google.com/p/morphia/ – erdimeola

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); 
} 
+0

这将无法正确解析日期字段。他们将会受到's'和''特殊待遇。 – Jan