Fastjson格式化输出详解

一、时间格式序列化

1、时间格式化

JSONObject.toJSONStringWithDateFormat(time, "yyyy-MM-dd HH:mm:ss")

Fastjson可以直接对Date类型进行格式化输出,格式化方法调用了Java标准库DateFormat的格式化方法,自行传入自定义的解析规则即可。

2、JSONField

public class Person {
  @JSONField(format="yyyy-MM-dd")
  private Date birthday;
  //...
} 

使用JSONField注解的format属性可以直接对Date类型进行格式化输出。

3、JSONType

@JSONType (dateFormat = "yyyy-MM-dd HH:mm:ss")
public class Person {
    private Date createTime;
    //...
} 

通过JSONType注解实现类级别的日期格式化。

二、优化输出性能

1、缓存反射信息

public class User {
   private int id;
   private String name;
   //...
   private static final SerializeConfig config = new SerializeConfig();
   static {
       config.put(User.class, new UserSerializer());
   }
}

Fastjson为每个类的序列化都会创建一个序列化器,序列化器的创建会涉及到反射机制,创建序列化器的过程是比较耗时的。如果需要对同一类型的数据进行反复序列化,则可以使用静态的变量来缓存序列化的配置信息,避免反射机制的开销。

2、指定序列化顺序

public class User {
    private int id;
    private String name;
    //...

    static class IdNameSerializer implements JavaBeanSerializer {
        public final void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
            SerializeWriter out = serializer.out;
            User user = (User) object;
            Integer id = user.getId();
            String name = user.getName();

            if ((features & SerializerFeature.SortField.mask) != 0) {
                out.write('{');
                serializer.out.writeFieldName("id");
                serializer.out.writeInt(id);
                serializer.out.write(',');
                serializer.out.writeFieldName("name");
                serializer.out.writeString(name);
                serializer.out.write('}');
            } else {
                out.write('{');
                out.writeFieldName("name");
                serializer.write(name);
                out.write(',');
                out.writeFieldName("id");
                out.writeInt(id);
                out.write('}');
            }
        }
    }
}

Fastjson对于JavaBean的序列化顺序默认采用ASCII码顺序,可以使用SortFeild序列话属性控制输出顺序。此外,也可以编写自定义序列化器来制定输出顺序。

三、自定义输出

1、ValueFilter

ValueFilter valueFilter = new ValueFilter() {
  public Object process(Object obj, String s, Object v) {
    if(v == null) {
      return "";
    }
    return v;
  }
};

String jsonString = JSONObject.toJSONString(map, valueFilter);

通过实现ValueFilter接口,可以在序列化过程中动态改变某些Bean属性的值。

2、PropertyFilter

PropertyFilter propertyFilter = new PropertyFilter() {
  public boolean apply(Object object, String name, Object value) {
    if(name.equalsIgnoreCase("password")){
      return false;
    }
    return true;
  }
};

String jsonString = JSONObject.toJSONString(user, propertyFilter);

通过实现PropertyFilter接口,可以过滤不想序列化的Bean属性。

3、SerializeFilter

public class ValueLabelFilter implements NameFilter {
  private Object value;
  private String label;

  public ValueLabelFilter(Object value, String label) {
    this.value = value;
    this.label = label;
  }

  public String process(Object source, String name, Object value) {
    if (this.value.equals(value)) {
      return this.label;
    }
    return name;
  }
}

ValueLabelFilter filter = new ValueLabelFilter(0, "男");

SerializeFilter[] filters = {filter};
String jsonString = JSONObject.toJSONString(user, filters);

通过实现SerializeFilter接口,可以控制序列化过程中修改每个属性序列化时的过滤要求,一般同时实现NameFilter、ValueFilter、PropertyFilter三个接口。

四、异常处理

1、关闭循环引用检测

JSON.toJSONString(xxx, SerializerFeature.DisableCircularReferenceDetect)

默认情况下,Fastjson会检测到循环引用并抛出异常,如果不需要对循环引用进行处理,则可以禁用此项检测。

2、定制异常处理器

public class MyException extends RuntimeException {
  public MyException(Throwable cause) {
    super(cause);
  }
}

public class MyExceptionHandler implements ExceptionHandler {
  @Override
  public void handle(Exception ex) {
    throw new MyException(ex);
  }

  @Override
  public void handle(Exception ex, Object obj, Object fieldName) {
    throw new MyException(ex);
  }
}

SerializeWriter out = new SerializeWriter();
JSONSerializer serializer = new JSONSerializer(out);
serializer.setExceptionHandler(new MyExceptionHandler());
serializer.write(jsonObject);

如果Fastjson序列化过程中出现异常,则会自动调用默认的异常处理器,将异常信息打印出来。但是,你也可以定制自己的异常处理器,来处理Fastjson发生的异常。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/190977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-30 09:08
下一篇 2024-11-30 09:08

相关推荐

  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论