如何通过自定义JsonSerializer传递上下文?(Java,ObjectMapper)

如何通过自定义JsonSerializer传递上下文?(Java,ObjectMapper),java,jackson,Java,Jackson,我有自定义JsonSerializer: new JsonSerializer<T>() { @Override public void serialize(T instance, JsonGenerator gen, SerializerProvider sp) throws IOException, JsonProcessingException { try { instance = someFunction(ins

我有自定义JsonSerializer:

new JsonSerializer<T>() {
    @Override
    public void serialize(T instance, JsonGenerator gen, SerializerProvider sp) throws IOException, JsonProcessingException
    {
        try {
            instance = someFunction(instance);
            SerializableString serializableString = new SerializedString(defaultMapper.writeValueAsString(instance));
            gen.writeRawValue(serializableString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
newjsonserializer(){
@凌驾
public void serialize(T实例、JsonGenerator gen、SerializerProvider sp)引发IOException、JsonProcessingException
{
试一试{
instance=someFunction(实例);
SerializableString SerializableString=新的SerializableString(defaultMapper.writeValueAsString(实例));
gen.writeRawValue(serializableString);
}捕获(例外e){
e、 printStackTrace();
}
}
}
对于我的pourpuses,我需要一种方法将
gen.getOutputContext()
传递到
defaultMapper.writeValueAsString(实例)
。有没有办法做到这一点?还是我用错了ObjectMapper?谢谢你的见解


编辑:这里的
defaultMapper
类型为
ObjectMapper

以帮助我尽全力帮助您

我没有java环境设置,但这里有一个使用Jackson JSON包的示例:

让我知道这是否有帮助

根据本教程,根据对象的设置方式,您可以使用“writeVaueAsString(object o)with the method”writerWithDefaultPrettyPrinter()方法使用对象映射器对象来获取可读的JSON字符串

但是,这不是一个“自定义”序列化程序/反序列化程序


这个解决方案对您有用吗?

这里帮助您尽我最大的努力帮助您

我没有java环境设置,但这里有一个使用Jackson JSON包的示例:

让我知道这是否有帮助

根据本教程,根据对象的设置方式,您可以使用“writeVaueAsString(object o)with the method”writerWithDefaultPrettyPrinter()方法使用对象映射器对象来获取可读的JSON字符串

但是,这不是一个“自定义”序列化程序/反序列化程序


这个解决方案适合您吗?

ObjectMapper实际上具有我需要的内置方法-
ObjectMapper.writeValue(JsonGenerator,T)
。根据我的问题修改(和功能)代码:

new JsonSerializer<T>() {
    @Override
    public void serialize(T instance, JsonGenerator gen, SerializerProvider sp) throws IOException, JsonProcessingException
    {
        try {
            instance = someFunction(instance);
            defaultMapper.writeValue(gen, instance)
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
newjsonserializer(){
@凌驾
public void serialize(T实例、JsonGenerator gen、SerializerProvider sp)引发IOException、JsonProcessingException
{
试一试{
instance=someFunction(实例);
defaultMapper.writeValue(gen,实例)
}捕获(例外e){
e、 printStackTrace();
}
}
}

ObjectMapper实际上具有我需要的内置方法-
ObjectMapper.writeValue(JsonGenerator,T)
。根据我的问题修改(和功能)代码:

new JsonSerializer<T>() {
    @Override
    public void serialize(T instance, JsonGenerator gen, SerializerProvider sp) throws IOException, JsonProcessingException
    {
        try {
            instance = someFunction(instance);
            defaultMapper.writeValue(gen, instance)
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
newjsonserializer(){
@凌驾
public void serialize(T实例、JsonGenerator gen、SerializerProvider sp)引发IOException、JsonProcessingException
{
试一试{
instance=someFunction(实例);
defaultMapper.writeValue(gen,实例)
}捕获(例外e){
e、 printStackTrace();
}
}
}

此stackoverflow线程可能会回答您的问题。谢谢您的回答,但是我的问题不是映射器不工作-我正在使用自定义序列化程序进行一些数据转换,我需要知道某些对象(从根到对象的键集)的“路径”。但是,其他一些对象需要自定义序列化,因此当我需要访问“路径”(通过
gen.getOutputContext()
)时,我得到的只是最后一个自定义序列化对象的“路径”,而不是根。因此,我正在寻找一种方法,将
gen.getOutputContext()
传递给我的
默认映射器来解决这个问题。这个stackoverflow线程可能会回答您的问题。谢谢您的回答,但是我的问题不是映射器不工作-我正在使用自定义序列化程序进行一些数据转换,我需要知道某些对象(从根到对象的键集)的“路径”。但是,其他一些对象需要自定义序列化,因此当我需要访问“路径”(通过
gen.getOutputContext()
)时,我得到的只是最后一个自定义序列化对象的“路径”,而不是根。因此,我正在寻找一种方法,将
gen.getOutputContext()
传递给我的
默认映射器来解决这个问题。为什么需要它呢?@CassioMazzochiMolin正在使用jackson ObjectMapper为.csv文件创建基础来翻译数据。。。我为最终用户可见的文本提供了特殊的包装器,因此我可以使用自定义序列化器创建行(带有key、oldValue、newValue(要编辑),但我需要“path”来定位并将翻译集成到数据模式中)。然而,其他一些类需要它们自己的自定义序列化程序(类似于所提供的一个),我失去了上下文-因此,我只从最后一个自定义序列化节点获得“路径”,而不是从根节点获得“路径”,为什么需要它?@CassioMazzochiMolin正在使用jackson ObjectMapper为.csv文件创建基础来翻译数据。。。我为最终用户可见的文本提供了特殊的包装器,因此我可以使用自定义序列化器创建行(带有key、oldValue、newValue(要编辑),但我需要“path”来定位并将翻译集成到数据模式中)。但是,其他一些类需要它们自己的自定义序列化程序(类似于本文中提供的一个),并且我会释放上下文-因此,我只从最后一个自定义序列化节点获取“路径”,而不是从根节点