如何使用Jackson将嵌套的ObjectId序列化为String? [英] How to serialize nested ObjectId to String with Jackson?
问题描述
很多 问题有关从 ObjectId
转换为 String
与杰克逊。所有答案建议创建自己的 JsonSerializer< ObjectId>
或使用 @JsonSerialize注释
。 ObjectId
字段(using = ToStringSerializer.class)
There are many questions concerning conversion from ObjectId
to String
with jackson. All answers suggest either creating own JsonSerializer<ObjectId>
or annotating the ObjectId
field with @JsonSerialize(using = ToStringSerializer.class)
.
但是,我有一张有时包含<$ c $的地图c> ObjectIds ,即:
However, I have a map that sometimes contains ObjectIds
, i.e.:
class Whatever {
private Map<String, Object> parameters = new HashMap<>();
Whatever() {
parameters.put("tom", "Cat");
parameters.put("jerry", new ObjectId());
}
}
我希望杰克逊将其转换为:
I want jackson to convert it to:
{
"parameters": {
"tom": "cat",
"jerry": "57076a6ed1c5d61930a238c5"
}
}
但我得到:
{
"parameters": {
"tom": "cat",
"jerry": {
"date": 1460103790000,
"machineIdentifier": 13747670,
"processIdentifier": 6448,
"counter": 10631365,
"time": 1460103790000,
"timestamp": 1460103790,
"timeSecond": 1460103790
}
}
}
我已经注册了转换(在Spring中)
I have registered the conversion (in Spring) with
public class WebappConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder
.serializerByType(ObjectId.class, new ToStringSerializer());
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
converters.add(converter);
}
}
第一级 ObjectIds
已正确转换。如何让杰克逊转换成嵌套的?我是否必须为此地图编写自定义转换器?
And the first-level ObjectIds
are converted correctly. How to make jackson convert also the nested ones? Do I have to write custom converter for this map?
请记住,此地图
可以多次嵌套(即包含另一张地图)。我只想将 ObjectId
转换为 String
每当jackson看到它时。
Keep in mind that this Map
can be nested multiple times (i.e. contain another maps). I just want to convert ObjectId
to String
whenever jackson sees it.
推荐答案
我想你从 org那里拿走了
。你的代码对我来说非常好。我可以看到的一件事是你没有在 org.bson.types.ObjectId
。 springframework.boot:弹簧引导起动数据的mongodb WebappConfig
上面显示 @Configuration
注释。
I suppose that you are taking about org.bson.types.ObjectId
from org.springframework.boot:spring-boot-starter-data-mongodb
. Your code works perfectly fine for me. 1 thing i can see is that you don't show @Configuration
annotation above WebappConfig
.
这是我的演示项目,你可以在你的设置上进行测试吗?
Here is my demo project, can you test it on yours setup?
Application.java
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.bson.types.ObjectId;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Configuration
public static class WebappConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder
.serializerByType(ObjectId.class, new ToStringSerializer());
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
converters.add(converter);
}
}
@RestController
public static class MyRestController {
@ResponseBody
@RequestMapping("/")
public Whatever method() {
return new Whatever();
}
}
public static class Whatever {
private Map<String, Object> parameters = new HashMap<>();
public Whatever() {
parameters.put("tom", "Cat");
parameters.put("jerry", new ObjectId());
}
public Map<String, Object> getParameters() {
return parameters;
}
public void setParameters(Map<String, Object> parameters) {
this.parameters = parameters;
}
}
}
从127.0回复.0.1:8080
{
"parameters": {
"tom": "Cat",
"jerry": "5709df1cf0d9550b4de619d2"
}
}
Gradle:
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
compile("org.springframework.boot:spring-boot-starter-web")
}
这篇关于如何使用Jackson将嵌套的ObjectId序列化为String?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!