【问题标题】:How to serialize ObjectId to JSON?如何将 ObjectId 序列化为 JSON?
【发布时间】:2014-06-15 14:23:56
【问题描述】:

我想将我的 Product 类的 ObjectId 序列化为 JSON。我得到了以下 JSON:

[{"name":"Play for Java: Covers Play 2","type":"Book","company":"Manning Publications","price":30.0,"imagePath":"public/images/play-for-java.png","rating":4.5,"category":"Computer","author":"Nicolas Leroux","publicationDate":1396224000000,"numPage":320,"_id":539da7a6370882f10d5c2777}]

您会注意到"_id" 没有正确序列化,它应该是"539da7a6370882f10d5c2777"(带双引号)而不仅仅是539da7a6370882f10d5c2777

因此,我尝试实现自己的ObjectIdSerializer,如下所示:

import java.io.IOException;

import org.bson.types.ObjectId;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

public class ObjectIdSerializer extends JsonSerializer<ObjectId> {
    @Override
    public void serialize(ObjectId value, JsonGenerator jsonGen,SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jsonGen.writeString(value.toString());
    }
}

它给了我不同的错误:java.lang.String cannot be cast to org.bson.types.ObjectId (through reference chain: models.Book["_id"])

这是我的Product 班级和Book 班级:

Product.java

@JsonTypeInfo(use= JsonTypeInfo.Id.CLASS,property="_class")
public class Product {
    @ObjectId @Id
    @JsonSerialize(using = ObjectIdSerializer.class)
    protected String id;
    @JsonProperty("name")
    protected String name;
    @JsonProperty("type")
    protected String type;
    @JsonProperty("description")
    protected String description;
    @JsonProperty("company")
    protected String company;
    @JsonProperty("price")
    protected float price;
    @JsonProperty("imagePath")
    protected String imagePath;
    @JsonProperty("imageName")
    protected String imageName;
    @JsonProperty("rating")
    protected float rating;

    public Product() {
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    // Getters and setters
   ...    

Book.java

public class Book extends Product{

    @JsonProperty("category")
    private String category;
    @JsonProperty("author")
    private String author;
    @JsonProperty("publicationDate")
    private Date publicationDate;
    @JsonProperty("numPage")
    private int numPage;

    public Book() {
    }
    // Getters and setters   
   ...

您能帮我弄清楚如何正确地将ObjectId 序列化为 JSON 吗?

【问题讨论】:

    标签: java json mongodb jackson jongo


    【解决方案1】:

    看起来 Jackson 已被定制为以特殊方式序列化字符串 id 字段。这可能是与org.bson 库集成的一部分。

    问题在于您的反序列化器是由ObjectId 类型而不是String 或普通Object 参数化的。尝试如下更改它,并从字段声明中删除 @ObjectId 注释。这是一个例子:

    public class ObjectIdSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGen,SerializerProvider provider) throws IOException {
            jsonGen.writeString(value.toString());
        }
    }
    

    您也可以考虑采用the Jackson-Jongo provider class 来修复所有类的对象ID 序列化。

    【讨论】:

    • 感谢您的回复。除了序列化的_id有点奇怪之外,它几乎是完美的,“_id”:“\”539df7793708be9becea990e\“”。此外,我的 MongoDB 中的 _id 已从 "_id" : ObjectId("539e06e03708a8e88421cf6d") 更改为 "_id":"539e06e03708a8e88421cf6d"。有办法解决吗?
    • 您可以尝试删除 ObjectId 注释吗?我已经更新了关于它的答案。
    • 它就像一个魅力!您能否通过删除ObjectId 来解释一下为什么它会起作用?没有ObjectId,以后对我的课有影响吗?
    • 我想知道如果你只删除 ObjectId 注释和 JsonDeserialize 会发生什么?
    • 我得到了"_id" : "539e9c70ccf270420d3e96a8",但是,我不知道将_id 保留为字符串而不是ObjectId 是否好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2013-05-11
    • 1970-01-01
    • 2013-08-20
    • 2022-01-18
    相关资源
    最近更新 更多