Java 无法从mongodb解析json格式的文档列表

Java 无法从mongodb解析json格式的文档列表,java,mongodb,gson,Java,Mongodb,Gson,我有以下来自mongodb的回复,我找不到一种方法来取消搜索 更具体地说,我找不到解析$date元素和$oid的方法。我该如何编写与该元素对应的数据成员,还是必须编写内部类?这似乎是一个非常基本的问题,但我找不到方法。我将在gson parse中使用该类进行解析。谢谢,在toString中,$date和$oid是人工字段。如果您使用的是标准java mongo驱动程序,那么getcreated_at应该是java.util.Date实例,get_id应该是org.bson.types.Objec

我有以下来自mongodb的回复,我找不到一种方法来取消搜索


更具体地说,我找不到解析$date元素和$oid的方法。我该如何编写与该元素对应的数据成员,还是必须编写内部类?这似乎是一个非常基本的问题,但我找不到方法。我将在gson parse中使用该类进行解析。谢谢,在toString中,$date和$oid是人工字段。如果您使用的是标准java mongo驱动程序,那么getcreated_at应该是java.util.Date实例,get_id应该是org.bson.types.ObjectId实例


我对你的问题有点困惑,因此如果你使用的是原始的BSON对象,那么创建的将是一个BSON日期类型0x09,它的有效负载是一个自Unix时代以来表示毫秒的长值。_id将是一个BSON ObjectId类型0x07,id的有效负载为12个字节。如果我没有记错的话,它的endian与Java所期望的相反。有关更多详细信息,请参阅。

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


我对你的问题有点困惑,因此如果你使用的是原始的BSON对象,那么创建的将是一个BSON日期类型0x09,它的有效负载是一个自Unix时代以来表示毫秒的长值。_id将是一个BSON ObjectId类型0x07,id的有效负载为12个字节。如果我没有记错的话,它的endian与Java所期望的相反。有关更多详细信息,请参见。

我想我已经想出了解决方案,部分原因是我从mapping类中获得了这个想法,因此我不得不使用带有_id的注释,并在创建时创建。此外,我还必须为每个_id创建静态内部类,并在上创建_。下面给出了代码,它现在正在工作,但我认为有更优雅的解决方案,所以我保留这个问题,如果有人有更好的解决方案,其他人将在一段时间内关闭

          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;
    }
}

    }

我想我已经想出了解决方案,部分是我从mapping类中得到的想法,对于mapping类,我必须使用带有_id的注释并在创建时创建。此外,我还必须为每个_id创建静态内部类,并在上创建_。下面给出了代码,它现在正在工作,但我认为有更优雅的解决方案,所以我保留这个问题,如果有人有更好的解决方案,其他人将在一段时间内关闭

          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;
    }
}

    }

我有点被你的问题弄糊涂了——你是想访问Java程序中的oid或date字段吗?您在哪一步上遇到问题?_id字段被设置为{$oid:some id}的嵌入文档,它本身只是一个BSON对象,因此要获取$oid字段的内容,可以调用以下命令:document.get _id.get$oid。这就是你要问的吗?我明白你想说什么,但我在Android上使用这段代码,对于这个平台,我们没有mongodb库。因此,我们必须使用json解析从json对象中获取信息。我正在使用Gson,它需要一个映射类来获取对象,而我在获取BSON对象_oid和$date时遇到了问题。我对您的问题有点困惑-您是否试图访问Java程序中的oid或date字段?您在哪一步上遇到问题?_id字段被设置为{$oid:some id}的嵌入文档,它本身只是一个BSON对象,因此要获取$oid字段的内容,可以调用以下命令:document.get _id.get$oid。这就是你要问的吗?我明白你想说什么,但我在Android上使用这段代码,对于这个平台,我们没有mongodb库。因此,我们必须使用json解析从json对象中获取信息。我正在使用Gson,它需要一个映射类来获取对象,而我在获取BSON对象_oid和$date时遇到了问题。