【问题标题】:Serialization of root primitive objects with Jackson使用 Jackson 序列化根原始对象
【发布时间】:2012-07-18 19:58:16
【问题描述】:

我面临以下问题。当 Jackson 序列化器被传递一个包装的原语进行序列化时,这个原语会被序列化,例如:

objectMapper = new ObjectMapper();

StringWriter w = new StringWriter();
objectMapper.writeValue(w, Integer.valueOf(10));
System.out.println(w.toString());

产生10 作为输出。然而,10 不是一个有效的 JSON(根据jsonlint),应该用方括号([10],因此它将是一个单元素数组)或花括号({value:10},所以它将是一个具有虚拟属性的对象)。问题影响数字,java.lang.Stringjava.util.Date,...

我的问题是:如何让杰克逊执行包装? Jackson 不应该总是生成有效的 JSON 吗?

我已经分析了启用SerializationConfig.Feature.WRAP_ROOT_VALUE 的杰克逊行为:它不像我预期的那样工作。原语现在被序列化为有效的 JSON ({"Integer":10}),但“普通”Java bean 也被包装,这是不受欢迎的({"MyBean":{"field":value, ...}} 而不是{"field":value, ...})。

如果有人可以建议如何自定义 Jackson,也许可以使用自定义序列化程序。困难在于必须区分根原始包装器(需要包装)和 bean 原始属性(不需要包装)。

为了让故事更完整:Jackson 序列化器被用作 Spring MVC 的消息转换器,我怀疑编写一个挂钩来拦截原语的序列化是否相当容易(它不会调用 Jackson,但会简单地返回 "[" + String.toString(obj) + "]"必要的)。所以我更喜欢调谐 Jackson 的解决方案。

【问题讨论】:

标签: java json serialization jackson


【解决方案1】:

最后是自定义序列化器

import java.io.IOException;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.ser.std.ScalarSerializerBase;

public class NumberSerializer extends ScalarSerializerBase<Number> {

    protected NumberSerializer() {
        super(Number.class);
    }

    @Override
    public void serialize(Number value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
                JsonGenerationException {
        if (jgen.getOutputContext().inRoot()) {
            jgen.writeStartArray();
            jgen.writeNumber(value.longValue());
            jgen.writeEndArray();
        }
        else {
            jgen.writeNumber(value.longValue());
        }
    }
}

为我做了一份工作。序列化器可以注册为模块(参见here)。

使用此序列化器时请注意:由于它将所有原始数组转换为只有一个元素的原始数组,因此在某种意义上打破了反射原理,A != desrialize(serialize(A)) 其中A 是一些原始数组。

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多