Java 如何用Jackson将嵌套ObjectId序列化为字符串?
使用jackson可以将Java 如何用Jackson将嵌套ObjectId序列化为字符串?,java,json,spring,jackson,Java,Json,Spring,Jackson,使用jackson可以将ObjectId转换为String。所有答案都建议要么创建自己的JsonSerializer,要么用@JsonSerialize(使用=ToStringSerializer.class)注释ObjectId字段 但是,我有一个有时包含objectid的映射,即: class Whatever { private Map<String, Object> parameters = new HashMap<>(); Whatever() {
ObjectId
转换为String
。所有答案都建议要么创建自己的JsonSerializer
,要么用@JsonSerialize(使用=ToStringSerializer.class)
注释ObjectId
字段
但是,我有一个有时包含objectid
的映射,即:
class Whatever {
private Map<String, Object> parameters = new HashMap<>();
Whatever() {
parameters.put("tom", "Cat");
parameters.put("jerry", new ObjectId());
}
}
但我得到:
{
"parameters": {
"tom": "cat",
"jerry": {
"date": 1460103790000,
"machineIdentifier": 13747670,
"processIdentifier": 6448,
"counter": 10631365,
"time": 1460103790000,
"timestamp": 1460103790,
"timeSecond": 1460103790
}
}
}
我已(在春季)向
公共类WebappConfig扩展了WebMVCConfigureAdapter{
@凌驾
公共无效配置MessageConverters(列表我想您是从org.springframework.boot:spring boot starter data mongodb
中获取关于org.bson.types.ObjectId的。您的代码对我来说运行得非常好。我可以看到的一件事是,您没有在WebappConfig
上面显示@Configuration
注释
这是我的演示项目,你能在你的设置上测试它吗
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;
}
}
}
Gradle:
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
compile("org.springframework.boot:spring-boot-starter-web")
}
感谢varren的回答,它在springMvc的旧版本中运行良好。
但是自5.0以来,WebMVCConfigureAdapter被弃用。
解决方案:
可能不起作用的解决方案:我们可以直接为mvc配置实现WebMVCConfiguer。但是一些配置可能不起作用,因为WebMvcConfigurationSupport的优先级更高
建议解决方案:我们可以直接扩展WebMvcConfigurationSupport
spring框架是一个惊人的框架,我需要在有时间后再深入研究它(●'◡'●) 我已经创建了一个,并且它也为我正确映射。似乎我必须更仔细地调查这个问题。感谢您检查此项,如果我发现了什么,我将发布更新。我现在可以确认这是应用程序另一个位置的错误。映射
是由另一个对象映射器实例f转换的rom jackson而不是Spring上下文中使用的。它没有应用thObjectId
配置,因此无法工作。感谢您强迫be创建一个最小的示例,并为我的错误感到抱歉!我尝试运行上面发布的Application.java,但运气不佳。使用此处描述的@JsonSerialize注释仍然有效:
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;
}
}
}
{
"parameters": {
"tom": "Cat",
"jerry": "5709df1cf0d9550b4de619d2"
}
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
compile("org.springframework.boot:spring-boot-starter-web")
}