选项 1. 自定义序列化程序
@teppic 答案应该适用于大多数情况,但是
您不需要自定义反序列化程序。默认的反序列化器可以处理 String => long
-
可以使用com.fasterxml.jackson.databind.ser.std.ToStringSerializer序列化器
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(long.class, ToStringSerializer.instance);
-
您会遇到边缘情况,因为自定义序列化器方法实际上无法处理另一个自定义序列化器使用 this JsonGenerator method 的情况
(JsonGenerator) g.writeNumber((long)value);
这里最重要的边缘情况是long[].class
static class MyBean {
long val = 1; // works fine "1"
Long val2 = 2L; // works fine "2"
long[] vals = {1,2}; // doesn't work [1,2]
}
其实你可以
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(long.class, ToStringSerializer.instance);
module.addSerializer(long[].class, new JsonSerializer<long[]>(){
@Override
public final void serialize(
long[] value, JsonGenerator g, SerializerProvider provider)
throws IOException {
g.writeStartArray();
for (int i = 0, len = value.length; i < len; ++i)
g.writeString(String.valueOf(value[i]));
g.writeEndArray();
}
});
// register every other serializers that use
// (JsonGenerator) g.writeNumber((long)value);
// like AtomicLong, if you use it in your code
mapper.registerModule(module);
MyBean bean = new MyBean();
String json = mapper.writeValueAsString(bean);
MyBean myBean2 = mapper.readValue(json, MyBean.class);
System.out.println(json);
System.out.println(myBean2);
System.out.println(mapper.writeValueAsString(myBean2));
}
选项 2. 自定义 JsonFactory 和 JsonGenerator
但话又说回来,这对你来说足够了吗,你确定没有人会尝试使用jsonGenerator.writeNumber(long) 还是你有其他的类,实际上默认使用它?因此,100% 可行的解决方案是在 ObjectMapper 上注册自定义 JsonFactory,并使用 2 个重写方法 _createGenerator 和 _createUTF8Generator
JsonFactory factory = new JsonFactory(){
@Override
protected JsonGenerator _createGenerator(Writer out, IOContext ctxt)
throws IOException {
WriterBasedJsonGenerator gen = new WriterBasedJsonGenerator(ctxt,
_generatorFeatures, _objectCodec, out){
@Override
public void writeNumber(long l) throws IOException {
writeString(String.valueOf(l));
}
};
return _internalSuperSetup(gen);
}
@Override
protected JsonGenerator _createUTF8Generator(OutputStream out, IOContext ctxt)
throws IOException {
UTF8JsonGenerator gen = new UTF8JsonGenerator(ctxt,
_generatorFeatures, _objectCodec, out){
@Override
public void writeNumber(long l) throws IOException {
writeString(String.valueOf(l));
}
};
return _internalSuperSetup(gen);
}
// reuse code from _createUTF8Generator and _createGenerator super methods
private JsonGenerator _internalSuperSetup(JsonGenerator gen){
if (_characterEscapes != null) gen.setCharacterEscapes(_characterEscapes);
SerializableString rootSep = _rootValueSeparator;
if (rootSep != DefaultPrettyPrinter.DEFAULT_ROOT_VALUE_SEPARATOR)
gen.setRootValueSeparator(rootSep);
return gen;
}
};
ObjectMapper mapper = new ObjectMapper(factory);