fastjson枚举转换_fastjson 字符串转枚举-程序员宅基地

技术标签: Java  fastjson  枚举  索引  enum  int  

http://zhidao.baidu.com/link?url=buRL8gjIT75xDZgYJG7SwyB5EzES8cgiNPDCPLNMPXLVYyNR9tPbklmxOYWVzmTT0G1V1ewdcLmaTvTwnqTSF9ZS_hl8gC_Ed4iNdYD1XYu

看fastjson源码,SerializeWriter

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值

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;
  }

所以,解决你这个问题的方法就是
之前调用下
JSONSerializer.config(SerializerFeature.WriteEnumUsingToString,false);

我的实体类里面有一个熟悉是枚举类型的,但是我在转换的时候我不希望取它的name,而且她的索引值0,1,2,3,搜索一番后发现这个回答.
但是JSONSerializer.config不是一个静态方法,不能直接调用

而且如果直接调用JSON.toJSON把实体类转为json,这里还有另外一句代码

if (clazz.isEnum()) {
    return ((Enum<?>) javaObject).name();
}

如果是枚举类型,不管你怎么改配置都不会给你转成索引值的情况,所以我们这里就先想把实体转成jsonString,再把jsonString转成JSONObject。


再继续看fastjson的源码
在JOSN.toJSONString中


public static final String toJSONString(Object object, SerializerFeature... features) {
        SerializeWriter out = new SerializeWriter();

        try {
            JSONSerializer serializer = new JSONSerializer(out);
            for (com.alibaba.fastjson.serializer.SerializerFeature feature : features) {
                serializer.config(feature, true);
            }

            serializer.write(object);

            return out.toString();
        } finally {
            out.close();
        }
    }


他这里也是用的serializer.config来配置的,干脆我们自己写个工具方法吧,同时把WriteEnumUsingToString禁用掉


private static final SerializerFeature[] CONFIG = new SerializerFeature[]{
            SerializerFeature.WriteNullBooleanAsFalse,//boolean为null时输出false
            SerializerFeature.WriteMapNullValue, //输出空置的字段
            SerializerFeature.WriteNonStringKeyAsString,//如果key不为String 则转换为String 比如Map的key为Integer
            SerializerFeature.WriteNullListAsEmpty,//list为null时输出[]
            SerializerFeature.WriteNullNumberAsZero,//number为null时输出0
            SerializerFeature.WriteNullStringAsEmpty//String为null时输出""
    };

    public static JSONObject toJSON(Object javaObject) {

        SerializeWriter out = new SerializeWriter();
        String jsonStr;
        try {
            JSONSerializer serializer = new JSONSerializer(out);

            for (com.alibaba.fastjson.serializer.SerializerFeature feature : CONFIG) {
                serializer.config(feature, true);
            }
            serializer.config(SerializerFeature.WriteEnumUsingToString, false);
            serializer.write(javaObject);

            jsonStr =  out.toString();
        } finally {
            out.close();
        }
        JSONObject jsonObject = JSON.parseObject(jsonStr);
        return jsonObject;
    }


这样转换出来的结果,就是我们想要的数字了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yfisaboy/article/details/43196105

智能推荐

机器学习-Anomaly Detection_根据f1值或者查准率与查全率的比例来选择ε-程序员宅基地

文章浏览阅读347次。Problem Motivation异常检测(Anomaly detection)是机器学习算法的一个常见应用。这种算法的一个有趣之处在于:它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行 QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,..._根据f1值或者查准率与查全率的比例来选择ε

【蓝桥杯2024真题】好数

【评测用例规模与约定】 对于10%的评测用例,1≤N≤100。对于100% 的评测用例,【样例说明】 对于第一个样例,24以内的好数有1、3、5、7、9、21、23,一共7个。时间限制: 1.0s 内存限制: 256.0MB 本题总分:10分。【输出格式】 一个整数代表答案。【输入格式】 一个整数N。【样例输入2】 2024。【样例输出2】 150。【样例输入1】 24。

Java毕业设计 基于SpringBoot vue城镇保障性住房管理系统

首页 图片轮播 房源信息 房源详情 申请房源 公示信息 公示详情 登录注册 个人中心 留言反馈后台管理 登录 个人中心 修改密码 个人信息 用户管理 房屋类型 房源信息管理 房源申请管理 住房分配管理 留言板管理 轮播图管理 公示信息管理角色:用户 管理员大家可。

xhadmin多应用SaaS框架之智慧驾校H5+小程序v1.1.5正式发布!

xhadmin 是一套基于最新技术的研发的多应用 Saas 框架,支持在线升级和安装模块及模板,拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能,助力企业发展、国家富强,致力于打造最受欢迎的多应用 Saas 系统。

【Vue3源码学习】— CH3.4 baseCreateRenderer 详解

在 baseCreateRenderer 中,定义了多种方法,例如 patch、mountComponent、updateComponent 等,这些方法各自承担不同的渲染任务。这些定义不直接执行任何操作,而是为后续的渲染流程提供必要的工具和函数。baseCreateRenderer 更像是一个配置和定义渲染器行为的场所,而具体的渲染逻辑则是在实际调用 render 方法时,按需执行这些预定义的方法。这样的设计不仅清晰地分离了配置与执行,也使得 Vue 渲染器可以灵活地适应不同的渲染需求和环境。

ROS1快速入门学习笔记 - 10服务数据的定义和使用

三个横线作为一个区分,上面是request,下面是response;创建完之后如下所示。

随便推点

经典收藏 50个jQuery Mobile开发技巧集萃-程序员宅基地

文章浏览阅读460次。1、Backbone移动实例这是在Safari中运行的一款Backbone移动应用程序。想开始体验移动开发,一个好的出发点就是关注这个应用程序的构建方式。先不妨在你的浏览器中查看该应用程序。相关链接:http://bennolan.com/2010/11/24/backbone-jquery-demo.html2、使用媒体查询来锁定设备你可能会问如何使用CSS来锁定设备(根...

C++GDI做进度条-程序员宅基地

文章浏览阅读264次。直接上代码:#include <windows.h> /* This is where all the input to the window goes to */LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { /* Upon destruction, tell the main thread to stop */ ..

7-34 通讯录的录入与显示 -----python_7-34 通讯录的录入与显示python-程序员宅基地

文章浏览阅读1.4k次。通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。输入格式:输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女..._7-34 通讯录的录入与显示python

K210与STM32之间的通信_k210与stm32通信-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏70次。K210与STM32之间使用串口进行通信_k210与stm32通信

OpenHarmony语言基础类库【@ohos.util.List (线性容器List)】

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点。

[自学笔记] ESP32-C3 Micropython初次配置

2、本次测试了两款IDE,分别是"thonny-4.1.4.exe"和"uPyCraft-v1.0.exe"。Thonny支持中文及多语言。而uPyCraft-v1.0只支持英文语言。因此入门时选用了Thonny作为IDE。(注:1、测试过程中IDE正常连接ESP32C3简约版的虚拟串口。不受简约版无串口芯片的影响。

推荐文章

热门文章

相关标签