2

我收到了来自 mongodb 的以下响应,但我找不到反序列化的方法。

[{ "_id" : { "$oid" : "some ids"} ,
   "index" : 0 , 
   "question" : "some text ?",
   "optiona" : "OS",
   "optionb" : "JAVA",
   "optionc" : "C",
   "optiond" : "C#",
   "answer" : "JAVA",
   "created_at" : { "$date" : "2012-09-20T06:37:04.306Z" },
   "Active" : "1"
 }, 
 { "_id" : { "$oid" : "505ab997aded66f4c1ccc7f3" }, 
   "index" : 1 ,
   ..../objects like that
}]

更具体地说,我找不到解析 $date 元素和 $oid 的方法。如何编写与该元素对应的数据成员,还是必须编写内部类?这似乎是一个非常基本的问题,但我找不到方法。我将在 gson parse 中使用该类来解析。谢谢

4

2 回答 2

0

在 toString 中,$date 和 $oid 是人工字段。如果您使用标准的 java mongo 驱动程序,那么 get("created_at") 应该是 java.util.Date 实例,而 get("_id") 应该是 org.bson.types.ObjectId 实例。

我对你的问题有点困惑,所以如果你使用的是原始 BSON 对象,那么“created_at”将是一个 BSON 日期类型(0x09),它的有效负载是自 Unix 纪元以来代表毫秒的长整数。“_id”将是一个 BSON ObjectId 类型 (0x07),id 的有效负载为 12 个字节。如果我没记错的话,它与 Java 所期望的相反。有关详细信息,请参阅BSON 规范。

于 2012-10-22T19:24:55.723 回答
0

我想我已经想出了解决方案,部分是我从中得到了这个想法对于映射类,我不得不使用带有_idcreated_at的注释。我还必须为每个 _id 和 created_at 创建静态内部类。下面给出了代码,它现在正在运行,但我认为那里有更优雅的解决方案,所以如果有人有更好的解决方案,我会保持这个问题开放,否则会在一段时间内关闭

          import com.google.gson.annotations.SerializedName;
          import java.sql.Date;



         public class QuizDBObject {

/**
 * this class will work as the place holder for the quiz object.
 * An extra variable is added to store answer given by user.
 */
@SerializedName("_id")
 Id _id;



public Id get_id() {
    return _id;
}
public void set_id(Id _id) {
    this._id = _id;
}
@SerializedName("index")

private long index ;
@SerializedName("question")

private String question;
@SerializedName("answer")

private String answer;
@SerializedName("optiona")

private String optiona;
@SerializedName("optionb")

private String optionb;
@SerializedName("optionc")

private String optionc;
@SerializedName("optiond")

private String optiond;
@SerializedName("created_at") 
MyDate created_at;

    public MyDate getCreated_at() {
    return created_at;
}
public void setCreated_at(MyDate created_at) {
    this.created_at = created_at;
}

public void setOptiona(String optiona) {
    this.optiona = optiona;
}
@SerializedName("Active")
private String Active;
/**
 * for storing the answer given by the user for every question.
 */
private String userAnswer;



public String getUserAnswer() {
    return userAnswer;
}
public void setUserAnswer(String userAnswer) {
    this.userAnswer = userAnswer;
}
public QuizDBObject(){
    super();
}

public long getIndex() {
    return index;
}
public void setIndex(long index) {
    this.index = index;
}
public String getQuestion() {
    return question;
}
public void setQuestion(String question) {
    this.question = question;
}
public String getAnswer() {
    return answer;
}
public void setAnswer(String answer) {
    this.answer = answer;
}
public String getOptiona() {
    return optiona;
}
public void setOptionA(String optiona) {
    this.optiona = optiona;
}
public String getOptionb() {
    return optionb;
}
public void setOptionb(String optionb) {
    this.optionb = optionb;
}
public String getOptionc() {
    return optionc;
}
public void setOptionc(String optionc) {
    this.optionc = optionc;
}
public String getOptiond() {
    return optiond;
}
public void setOptiond(String optiond) {
    this.optiond = optiond;
}

public String getActive() {
    return Active;
}
public void setActive(String Active) {
    this.Active = Active;
}
/*public void setCreatedAtString(String type) {
    this.created_at.parse(type);

}
*/

static class Id{
    String $id;

    public String get$id() {
        return $id;
    }

    public void set$id(String $id) {
        this.$id = $id;
    }

}
static class MyDate{
    String $date;

    public String get$date() {
        return $date;
    }

    public void set$date(String $date) {
        this.$date = $date;
    }
}

    }
于 2012-10-29T06:24:27.123 回答