JacksonMap器序列化/反序列化ObjectId

avwztpqn  于 2022-11-08  发布在  Java
关注(0)|答案(3)|浏览(197)

我的POJO是:

import org.jongo.marshall.jackson.id.Id;

public class User {    

    @Id
    private String id;
    private String name;
    private int age;

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

我从mongo数据库中获取用户,并希望使用Jacksonmapper将其输出到文件中。

ObjectMapper mapper = new ObjectMapper();
mapper.writerWithDefaultPrettyPrinter().writeValue(new File("c:/user.txt"), user);

我的档案里有这样的东西

{
    "name" : "John",
    "age" : 23,
    "_id" : {
      "time" : 1358443593000,
      "inc" : 660831772,
      "machine" : 2028353122,
      "new" : false,
      "timeSecond" : 1358443593
    }
}

我需要将id字段作为字符串存储到文件中,因为当我反序列化此对象时,pojo中的id字段看起来如下所示:

{
   "time":1358443593000,
   "inc":660831772,
   "machine":2028353122,
   "new":false,
   "timeSecond":1358443593
}

任何帮助都将不胜感激。

mwngjboj

mwngjboj1#

回答我自己的问题。在此找到解决方案Spring 3.2 and Jackson 2: add custom object mapper
我需要自定义对象Map器和ObjectId序列化程序。

public class ObjectIdSerializer extends JsonSerializer<ObjectId> {

    @Override
    public void serialize(ObjectId value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeString(value.toString());
    }
}

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        SimpleModule module = new SimpleModule("ObjectIdmodule");
        module.addSerializer(ObjectId.class, new ObjectIdSerializer());
        this.registerModule(module);
    }

}
vlju58qv

vlju58qv2#

我发现了一个使用springboot 2.5.4的简单尝试。
只需添加一个Jackson2ObjectMapperBuilderCustomizer bean就可以了。

@Configuration
public class JacksonMapperConfiguration
{   
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        return builder -> builder.serializerByType(ObjectId.class, new ToStringSerializer());
    }
}
tyu7yeag

tyu7yeag3#

如果您没有所存储对象的模型,下面是一个简单的序列化解决方案:

client.getDatabase("db").getCollection("collection").find().onEach { it["_id"] = it["_id"].toString() }

“onEach”是一个Kotlin函数。如果你使用Java,那么就把它改成一个简单的foreach。
只为id迭代整个列表是没有效率的。只对性能不如短代码重要的小列表使用它。

相关问题