我的实体类里面有一个属性是枚举类型的,但是我在转换的时候我不希望取它的name,而是它的索引值0,1,2,3,搜索一番后发现这个回答
fastjson enum 枚举 反序列化
为了方便大家查看,我把内容贴过来
看fastjson源码,SerializeWriter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public void writeEnum( Enum < ?>value, char c )
{
if ( value == null )
{
writeNull();
write( ',' );
return;
}
if ( isEnabled( SerializerFeature.WriteEnumUsingToString ) )
{
if ( isEnabled( SerializerFeature.UseSingleQuotes ) )
{
write( '\'' );
write( value.name() );
write( '\'' );
write( c );
} else {
write( '\"' );
write( value.name() );
write( '\"' );
write( c );
}
return;
}
writeIntAndChar( value.ordinal(), c );
}
可以看出SerializeWriter在初始化的时候,features不要设置SerializerFeature.WriteEnumUsingToString
因为JSON.DEFAULT_PARSER_FEATURE是enable了SerializerFeature.WriteEnumUsingToString,也就是说是读枚举的value值而不是int值
1
2
3
4
5
6
7
8
9
10 public static int DEFAULT_GENERATE_FEATURE;
static {
int features = 0;
features |= com.alibaba.fastjson.serializer.SerializerFeature.QuoteFieldNames.getMask();
features |= com.alibaba.fastjson.serializer.SerializerFeature.SkipTransientField.getMask();
features |= com.alibaba.fastjson.serializer.SerializerFeature.WriteEnumUsingToString.getMask();
features |= com.alibaba.fastjson.serializer.SerializerFeature.SortField.getMask();
// features |= com.alibaba.fastjson.serializer.SerializerFeature.WriteSlashAsSpecial.getMask();
DEFAULT_GENERATE_FEATURE = features;
}所以,解决你这个问题的方法就是之前调用
1 JSONSerializer.config(SerializerFeature.WriteEnumUsingToString,false);
但是JSONSerializer.config
不是一个静态方法,不能直接调用
而且如果直接调用JSON.toJSON
把实体类转为json
,这里还有另外一句代码
1 | if (clazz.isEnum()) { |
他这里也是用的serializer.config
来配置的,干脆我们自己写个工具方法吧,同时把WriteEnumUsingToString
禁用掉
1 | private static final SerializerFeature[] CONFIG = new SerializerFeature[]{ |
这样调用我们的工具类方法转换出来的结果,就是我们想要的数字了。