我的实体类里面有一个属性是枚举类型的,但是我在转换的时候我不希望取它的name,而是它的索引值0,1,2,3,搜索一番后发现这个回答
fastjson enum 枚举 反序列化
为了方便大家查看,我把内容贴过来
看fastjson源码,SerializeWriter
1234567891011121314151617181920212223242526272829 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值
12345678910 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
,这里还有另外一句代码
他这里也是用的serializer.config
来配置的,干脆我们自己写个工具方法吧,同时把WriteEnumUsingToString
禁用掉
这样调用我们的工具类方法转换出来的结果,就是我们想要的数字了。