java - 如何将ObjectId序列化为JSON?

标签 java json mongodb jackson jongo

我想将我的 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无法转换为org.bson.types.ObjectId(通过引用链:models.Book[“_id”])

这是我的 Product 类和 Book 类:

产品.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 吗?

最佳答案

看起来 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 序列化。

关于java - 如何将ObjectId序列化为JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24230526/

相关文章:

java - 在 Jboss 7.0.2 中部署一个 war 文件

javascript - 如何通过 JavaScript/JQuery 查找多维数组中元素的索引

mongodb - 可以通过索引在 MongoDB 中使 $unwind 快速吗?

mongodb - 蒙戈错误: connect ECONNREFUSED in Docker

Java swing 重绘 GUI

java - Node JS session 不持久

java - Spring应用上下文

用于显示高级自定义字段的 JSON API - WordPress

java - 使用Gson将自定义类的ArrayList序列化为JSON并通过HTTP发送数据

消息应用程序的 MongoDB 结构