Java 使用Jackson序列化根基元对象

Java 使用Jackson序列化根基元对象,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我面临以下问题。当Jackson serializer被传递用于序列化的包装原语时,此原语按原样序列化,例如: objectMapper = new ObjectMapper(); StringWriter w = new StringWriter(); objectMapper.writeValue(w, Integer.valueOf(10)); System.out.println(w.toString()); 生成10作为输出。但是,10不是有效的JSON(根据),应该用方括号([1

我面临以下问题。当Jackson serializer被传递用于序列化的包装原语时,此原语按原样序列化,例如:

objectMapper = new ObjectMapper();

StringWriter w = new StringWriter();
objectMapper.writeValue(w, Integer.valueOf(10));
System.out.println(w.toString());
生成
10
作为输出。但是,
10
不是有效的JSON(根据),应该用方括号(
[10]
,因此它将是一个单元素数组)或花括号(
{value:10}
,因此它将是一个具有虚拟属性的对象)包装。该问题影响数字,
java.lang.String
java.util.Date

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

我已经分析了启用了
SerializationConfig.Feature.WRAP\u ROOT\u值的Jackson行为:它没有像我预期的那样工作。原语现在被序列化为有效的JSON(
{“Integer”:10}
),但是“普通”Java bean也被包装,这是不需要的(
{“MyBean”:{“field”:value,…}}
而不是
{“field”:value,…}

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


为了让故事更完整:Jackson serializer被用作Spring MVC的消息转换器,我怀疑编写一个钩子来拦截原语的序列化是否相当容易(它不会调用Jackson,只会在必要时返回
“[”+String.toString(obj)+“]”
)。因此,我更喜欢使用tuned Jackson的解决方案。

最后是自定义序列化程序

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());
        }
    }
}
import java.io.IOException;
导入org.codehaus.jackson.jsongGenerationException;
导入org.codehaus.jackson.jsonggenerator;
导入org.codehaus.jackson.map.SerializerProvider;
导入org.codehaus.jackson.map.ser.std.ScalarSerializerBase;
公共类NumberSerializer扩展了ScalarSerializerBase{
受保护的NumberSerializer(){
超级(数字类);
}
@凌驾
public void serialize(数值、JsonGenerator jgen、SerializerProvider提供程序)引发IOException,
JsonGenerationException{
if(jgen.getOutputContext().inRoot()){
jgen.writestarray();
jgen.writeNumber(value.longValue());
jgen.writeEndArray();
}
否则{
jgen.writeNumber(value.longValue());
}
}
}
为我做了一件事。序列化程序可以注册为模块(请参阅)


注意:当使用这个seriazlier时:由于它将所有的基元都转换成只有一个元素的基元数组,因此它在某种意义上打破了反射原理,
a!=desrialize(serialize(A))
其中
A
是一些基本元素。

我建议在