我想将我的 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/