Java 如何用Jackson将嵌套ObjectId序列化为字符串?

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() {

使用jackson可以将
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上下文中使用的。它没有应用th
    ObjectId
    配置,因此无法工作。感谢您强迫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")
    }