最近使用JsonSerializer<>编写自定义Serializer遇到2次序列化报出 Expected ':' instead of 't' 的错误,由于第一次解决办法没进行记录,导致第二次依旧花了点时间,所以在这里记录下。
Debug发现异常发生在IndexedListSerializer中:
@Override
public void serializeContents(List<?> value, JsonGenerator jgen, SerializerProvider provider)
throws IOException
{
if (_elementSerializer != null) {
serializeContentsUsing(value, jgen, provider, _elementSerializer);
return;
}
if (_valueTypeSerializer != null) {
serializeTypedContents(value, jgen, provider);
return;
}
final int len = value.size();
if (len == 0) {
return;
}
int i = 0;
try {
PropertySerializerMap serializers = _dynamicSerializers;
for (; i < len; ++i) {
Object elem = value.get(i);
if (elem == null) {
provider.defaultSerializeNull(jgen);
} else {
Class<?> cc = elem.getClass();
JsonSerializer<Object> serializer = serializers.serializerFor(cc);
if (serializer == null) {
// To fix [JACKSON-508]
if (_elementType.hasGenericTypes()) {
serializer = _findAndAddDynamic(serializers,
provider.constructSpecializedType(_elementType, cc), provider);
} else {
serializer = _findAndAddDynamic(serializers, cc, provider);
}
serializers = _dynamicSerializers;
}
serializer.serialize(elem, jgen, provider);
}
}
} catch (Exception e) {
wrapAndThrow(provider, e, value, i);
}
}
调用 serializer.serialize(elem, jgen, provider); 即调用了自定义Serializer,跟踪发现是由于属性在序列化是发生了NullPointException异常,导致序列化失败,Spring才抛出前面所写的错误。
回想第一次的问题,是在请求时发生的,只不过是在反序列化的时候。
结论:目前遇到问题所在的原因,都在编写Serializer时发生,所以check自定义Serializer方法为首要解决办法。
本文记录了使用JsonSerializer<>时遇到的序列化错误“Expected ':' instead of 't'”,并详细分析了错误原因及解决方案。通过检查自定义Serializer的方法,可以有效避免此类错误。
4961

被折叠的 条评论
为什么被折叠?



