在项目中有些状态需要采用枚举类型,在数据库中保存的是name(英文),而前台需要显示的是text(中文)。

所以这就需要自己去实现序列。

例如对象:

import java.util.Date;
import java.util.List; import com.alibaba.fastjson.annotation.JSONField; public class Project { /**
*
* 审核状态
*/
@JSONField(name = "auditStatus")
private AuditStatus auditStatus; /**
*
* 确认状态
*/
@JSONField(name = "confirmStatus")
private ConfirmStatus confirmStatus; /**
* 获取审核状态
*/
public AuditStatus getAuditStatus() {
return auditStatus;
} /**
* 设置审核状态
*/
public void setAuditStatus(AuditStatus auditingStatus) {
this.auditStatus = auditStatus ;
} /**
* 获取确认状态
*/
public ConfirmStatus getConfirmStatus() {
return confirmStatus;
} /**
*设置确认状态
*/
public void setConfirmStatus(ConfirmStatus confirmStatus) {
this.confirmStatus = confirmStatus;
} /**
* 项目状态
*/
@JSONField(name = "status")
private Status status; /**
*获取状态
*/
public Status getStatus() {
return status;
} /**
*设置状态
*/
public void setStatus(Status status) {
this.status = status;
} /**
* 状态枚举类
*
* @ClassName: Status
* @author liwenjian
* @date 2016年11月11日上午11:33:28
* @version 1.0.0
*/
public enum Status {
beginning("开始"),
finished("已结束"); private String text; private Status(String text) {
this.text = text;
} public String getText() {
return text;
} public static Status enumOf(Integer ordinal) {
for (Status s : Status.values()) {
if (ordinal == s.ordinal()) {
return s;
}
}
return null;
} public static Status enumOf(String name) {
for (Status s : Status.values()) {
if (name == s.name() || name.equalsIgnoreCase(s.name())) {
return s;
}
}
return null;
} public static String getText(Integer code) {
Status apf = enumOf(code);
if (apf != null) {
return apf.text;
}
return null;
} public static String getText(Status status) {
return status.getText();
} } /**
* 审核状态
*
* @ClassName: AuditStatus
* @author liwenjian
* @date 2016年11月27日下午2:42:46
* @version 1.0.0
*/
public enum AuditStatus {
/**
* 待审核
*/
pending("待审核"),
/**
* 已审核
*/
approve("已审核"),
/**
* 已退回
*/
refuse("已退回"),
/**
* 已取消
*/
cancel("已取消"); private String text; private AuditStatus(String text) {
this.text = text;
} public String getText() {
return text;
} public static AuditStatus enumOf(Integer ordinal) {
for (AuditStatus as : AuditStatus.values()) {
if (ordinal == as.ordinal()) {
return as;
}
}
return null;
} public static AuditStatus enumOf(String name) {
for (AuditStatus as : AuditStatus.values()) {
if (name == as.name() || name.equalsIgnoreCase(as.name())) {
return as;
}
}
return null;
} public static String getText(Integer code) {
AuditStatus as = enumOf(code);
if (as != null) {
return as.text;
}
return null;
} public static String getText(AuditStatus as) {
return as.getText();
} } /**
*
* 确认状态
*
* @ClassName: ConfirmStatus
* @author liwenjian
* @date 2016年11月29日上午11:15:18
* @version 1.0.0
*/
public enum ConfirmStatus {
/**
* 未确认
*/
pending("未确认"),
/**
* 已确认
*/
confirmed("已确认"); private String text; private ConfirmStatus(String text) {
this.text = text;
} public String getText() {
return text;
} public static ConfirmStatus enumOf(Integer ordinal) {
for (ConfirmStatus cs : ConfirmStatus.values()) {
if (ordinal == cs.ordinal()) {
return cs;
}
}
return null;
} public static ConfirmStatus enumOf(String name) {
for (ConfirmStatus cs : ConfirmStatus.values()) {
if (name == cs.name() || name.equalsIgnoreCase(cs.name())) {
return cs;
}
}
return null;
} public static String getText(Integer code) {
ConfirmStatus cs = enumOf(code);
if (cs != null) {
return cs.text;
}
return null;
} public static String getText(ConfirmStatus cs) {
return cs.getText();
} } }

数据库保存的状态为:beginning,finished等英文字段

采用JSONObject.toJSONString(project)来转会得到:{"status":"beginning","auditStatus":"pending","confirmStatus":"pending"}

而我的期望是得到:{"status":"开始","auditStatus":"待审核","confirmStatus":"未确认"}

下边就是我自己写的序列工具类:

package cn.com.yodata.core.util;

import java.io.IOException;
import java.lang.reflect.Type;
import java.text.DecimalFormat; import com.alibaba.fastjson.serializer.DoubleSerializer;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializeWriter;
import com.alibaba.fastjson.serializer.SerializerFeature; import com.lwj.modules.project.model.Project;
import com.lwj.modules.project.model.SubProject; /**
* JSON序列
*
* @ClassName: SerializeUtil
* @author liwenjian
* @date 2016年12月15日下午6:15:14
* @version 1.0.0
*/
public class SerializeUtil {
private static SerializeConfig globalInstance = SerializeConfig.getGlobalInstance();
static {
// 配置需要序列的指定类
globalInstance.put(Double.class, new DoubleSerializerConfig(new DecimalFormat("0.00")));
globalInstance.put(Project.Status.class, EnumStatusSerializer.instance);
globalInstance.put(Project.AuditStatus.class, EnumStatusSerializer.instance);
globalInstance.put(Project.ConfirmStatus.class, EnumStatusSerializer.instance);
globalInstance.put(SubProject.Status.class, EnumStatusSerializer.instance);
globalInstance.put(SubProject.AuditStatus.class, EnumStatusSerializer.instance);
} public static SerializeConfig instance() {
return globalInstance;
} /**
* Double格式保留两位小数点(0.00)
*
* @ClassName: DoubleSerializerConfig
* @author liwenjian
* @date 2016年12月17日下午3:09:43
* @version 1.0.0
*/
public static class DoubleSerializerConfig extends DoubleSerializer {
public DoubleSerializerConfig(DecimalFormat decimalFormat) {
this.decimalFormat = decimalFormat;
} private DecimalFormat decimalFormat = null; public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
throws IOException {
SerializeWriter out = serializer.out; if (object == null) {
out.writeNull(SerializerFeature.WriteNullNumberAsZero);
return;
} double doubleValue = ((Double) object).doubleValue(); if (Double.isNaN(doubleValue) || Double.isInfinite(doubleValue)) {
out.writeNull();
} else {
if (decimalFormat == null) {
out.writeDouble(doubleValue, true);
} else {
String doubleText = decimalFormat.format(doubleValue);
out.write("\"" + doubleText + "\"");
}
}
}
} /**
* 枚举类序列
*
* @ClassName: EnumStatusSerializer
* @author liwenjian
* @date 2017年2月23日上午11:13:50
* @version 1.0.0
*/
public static class EnumStatusSerializer implements ObjectSerializer { public final static EnumStatusSerializer instance = new EnumStatusSerializer(); @Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
throws IOException {
SerializeWriter out = serializer.out;
if (object instanceof Project.Status) {
// 总项目状态
Project.Status status = (Project.Status) object;
// 如果直接使用out.write(status.getText()),则输出的值没有双引号,json格式不对,所以这里前后加了双引号
out.write("\"" + status.getText() + "\"");
} else if (object instanceof Project.AuditStatus) {
// 总项目审核状态
Project.AuditStatus status = (Project.AuditStatus) object;
out.write("\"" + status.getText() + "\"");
} else if (object instanceof Project.ConfirmStatus) {
// 总项目确认状态
Project.ConfirmStatus status = (Project.ConfirmStatus) object;
out.write("\"" + status.getText() + "\"");
} else if (object instanceof SubProject.Status) {
SubProject.Status status = (SubProject.Status) object;
out.write("\"" + status.getText() + "\"");
} else if (object instanceof SubProject.AuditStatus) {
SubProject.AuditStatus status = (SubProject.AuditStatus) object;
out.write("\"" + status.getText() + "\"");
} else {
out.writeEnum((Enum<?>) object);
}
} } }

转换的时候需要加入自己指定的SerializeConfig。

JSONObject.toJSONString(project,SerializeUtil.instance());

上面SerializeUtil序列工具类主要实现了ObjectSerializer序列化器,并实现接口write(),然后自己实现write方法组合自己需要的值。

ObjectSerializer中原码如下:

/*
* Copyright 1999-2101 Alibaba Group.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.fastjson.serializer; import java.io.IOException;
import java.lang.reflect.Type; /**
* Interface representing a custom serializer for fastjson. You should write a custom serializer, if
* you are not happy with the default serialization done by fastjson. You will also need to register
* this serializer through {@link com.alibaba.fastjson.serializer.SerializeConfig#put(Type, ObjectSerializer)}.
*
* <pre>
* public static class Result {
* public ResultCode code;
* }
*
* public static enum ResultCode {
* LOGIN_FAILURE(8), INVALID_ARGUMENT(0), SIGN_ERROR(17);
* public final int value;
* ResultCode(int value){
* this.value = value;
* }
* }
*
* public static class ResultCodeSerilaizer implements ObjectSerializer {
* public void write(JSONSerializer serializer,
* Object object,
* Object fieldName,
* Type fieldType,
* int features) throws IOException {
* serializer.write(((ResultCode) object).value);
* }
* }
*
* SerializeConfig.getGlobalInstance().put(ResultCode.class, new ResultCodeSerilaizer());
*
* Result result = new Result();
* result.code = ResultCode.SIGN_ERROR;
* String json = JSON.toJSONString(result, config); // {"code":17}
* Assert.assertEquals("{\"code\":17}", json);
* </pre>
* @author wenshao[szujobs@hotmail.com]
*/
public interface ObjectSerializer { /**
* fastjson invokes this call-back method during serialization when it encounters a field of the
* specified type.
* @param serializer
* @param object src the object that needs to be converted to Json.
* @param fieldName parent object field name
* @param fieldType parent object field type
* @param features parent object field serializer features
* @throws IOException
*/
void write(JSONSerializer serializer, //
Object object, //
Object fieldName, //
Type fieldType, //
int features) throws IOException;
}

SerializeUtil工具类实现后的方法:

public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
throws IOException {
SerializeWriter out = serializer.out;
if (object instanceof Project.Status) {
// 总项目状态
Project.Status status = (Project.Status) object;
          //注意
          //如果直接使用out.write(status.getText()),则输出的值没有双引号,json格式不对,所以这里前后加了双引号
out.write("\"" + status.getText() + "\"");
} else if (object instanceof Project.AuditStatus) {
// 总项目审核状态
Project.AuditStatus status = (Project.AuditStatus) object;
out.write("\"" + status.getText() + "\"");
} else if (object instanceof Project.ConfirmStatus) {
// 总项目确认状态
Project.ConfirmStatus status = (Project.ConfirmStatus) object;
out.write("\"" + status.getText() + "\"");
} else if (object instanceof SubProject.Status) {
SubProject.Status status = (SubProject.Status) object;
out.write("\"" + status.getText() + "\"");
} else if (object instanceof SubProject.AuditStatus) {
SubProject.AuditStatus status = (SubProject.AuditStatus) object;
out.write("\"" + status.getText() + "\"");
} else {
out.writeEnum((Enum<?>) object);
} }

FastJson转换自定义枚举类的更多相关文章

  1. java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类

    枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但 ...

  2. Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类

    在JDK1.5之前没有enum关键字,如果想使用枚举类,程序员需要根据Java语言的规则自行设计.从JDK1.5开始,Java语言添加了enum关键字,可以通过该关键字方便地定义枚举类.这种枚举类有自 ...

  3. MyBatis 查询映射自定义枚举

    背景                  MyBatis查询若想映射枚举类型,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用         ...

  4. Enum 枚举类

    目录 Enum 枚举类 基础 定义与用途 基本方法 示例 进阶 实现原理 枚举与Class对象 自定义枚举类和构造方法及toString() Enum中使用抽象方法来实现枚举实例的多态性 Enum与接 ...

  5. Mybatis 枚举类处理

    目录 类型处理器(TypeHandler) 内置的枚举处理器 EnumTypeHandler源码 自定义枚举类处理 通用枚举处理器 Git 类型处理器(TypeHandler) 无论是 MyBatis ...

  6. SpringMVC 自动封装枚举类的方法

    springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...

  7. java枚举类

    enum关键字用于定义枚举类,若枚举只有一个成员, 则可以作为一种单例模式的实现方式.   枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰. 枚举类的使用 priva ...

  8. Java语法基础学习DayThirteen(枚举类和注解)

    一.枚举类 1.概述:即一个类中只能有有限个对象,若只有一个对象,则可以作为单例模式的一种实现. 2.自定义枚举类(JDK1.5以前这么做) //枚举类 class Season{ //1.提供类的属 ...

  9. 第8章 枚举类&注解

    8.枚举及注解 8.1 如何自定义枚举类 1课时 8.2 如何使用关键字enum定义枚举类 1课时 8.3 枚举类的主要方法 1课时 8.4 实现接口的枚举类 1课时 8-1 枚举类 枚举类入门 枚举 ...

随机推荐

  1. [转自itilxf论坛]iTop百问百答

    iTop是什么,和其他itsm软件相比有什么优势?iTop,是一个开源web应用程序,用于IT环境的日常运营.它基于ITIL最佳实践,而又不拘泥于任何具体流程. 优势: 1. 开源,扩展性强容易开发. ...

  2. 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码

    说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...

  3. PHP 接入芝麻信用 注意 事项

    芝麻官方下载的SDK,跑不起来,百度搜索一番也没有发现太多的文章 ,只有一个CSDN博客写的一篇文章,比较有参考价值 详细查阅文档+几天测试整理以下几点注意事项: 接入芝麻API接口,应该分2步: 第 ...

  4. NGUI渲染流程

    1 渲染流程 NGUI的渲染流程其实就是把Widget组件生成Mesh所需要的缓存数据,然后生成对应的DrallCall组合对应数据,生成渲染需要的Mesh数据,提交渲染. Widget(数据) UI ...

  5. 奥迪--A3

    -型号:A3 -价格:18-28W -动力:1.4T/1.8T -变速箱:7挡双离合 -长宽高:4.32,1.79,1.43(Limousine:4.46,1.80,1.42) -油箱:50L -发动 ...

  6. 开源代码分析之Android/iOS Hybrid JSBridge框架

    Hybrid开发是现在的主流形式,对于业务快速迭代的公司尤其重要.曾将在鞋厂接触了很多关于Hybrid的理念,在这里分享一些Hybrid框架思想. Hybrid框架包括Native与H5的通信,Web ...

  7. PHP 去除HTML标签 HTML实体转字符 br转\n

    1.去除HTML标签 strip_tags(string,allow)//剥去字符串中的 HTML 标签,但允许使用 <img> 标签:$str =  strip_tags($str,&q ...

  8. Spark会把数据都载入到内存么

    转载自:https://www.iteblog.com/archives/1648 前言: 很多初学者其实对于Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解.比如,很多时候我们常常 ...

  9. JDK安装配置

    http://www.runoob.com/java/java-environment-setup.html

  10. AJAX发送参数到后台,前台火狐debug报undefine

    后面经过查找:估计是数据并不是Json格式,由于var PATIENT_ID=getIdSelections();其中PATIENT_ID是数组,所以必须转成字符串. $('#table').on(' ...