您的位置:

Fastjson注解详解

Fastjson是一个高效的JSON库,支持多种数据格式的序列化和反序列化操作,而Fastjson注解则是Fastjson的重要一部分。本文将从多个方面对Fastjson注解进行详细的阐述。

一、Fastjson注解有哪些

Fastjson注解是一种使用Java注解的方式,用于方便的控制序列化和反序列化的数据格式。Fastjson注解包含以下几种:

  1. @JSONField:用于控制序列化和反序列化的属性名、格式、顺序等。
  2. @JSONType:用于控制类级别的序列化和反序列化配置,包含序列化和反序列化的过滤器、序列化的顺序等。
  3. @JSONCreator:用于指定一个自定义的构造函数,用于反序列化。
  4. @JSONPOJOBuilder:用于指定一个自定义的Builder类,用于反序列化。
  5. @JSONScannerAware:用于指定一个自定义的JSONReader,用于反序列化。

二、Fastjson注解货币转换

在实际业务场景中,我们常常需要对货币进行处理。Fastjson中提供了一种方便的方式,可以实现货币的格式控制和单位转换。

以货币格式控制为例:

public class MyBean {
    @JSONField(format="#,##0.00")
    private BigDecimal amount;
    ...
}

在上面的例子中,我们使用了@JSONField注解,并传入了一个format字符串,用来控制输出货币的格式。其中,“#,##0.00”表示以逗号为分隔符,保留两位小数。

以货币单位转换为例:

public class MyBean {
    @JSONField(format="RMB #.00")
    @JSONField(serializeUsing=Cent2DollarSerializer.class, deserializeUsing=Dollar2CentDeserializer.class)
    private BigDecimal amount;
    ...
}
public class Cent2DollarSerializer implements ObjectSerializer {
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
                      int features) throws IOException {
        BigDecimal amount = (BigDecimal) object;
        amount = amount.divide(new BigDecimal(100));
        serializer.write(amount);
    }
    ...
}
public class Dollar2CentDeserializer implements ObjectDeserializer {
    public BigDecimal deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        BigDecimal amount = parser.parseObject(BigDecimal.class);
        amount = amount.multiply(new BigDecimal(100));
        return amount;
    }
    ...
}

在上面的例子中,我们通过serializeUsing和deserializeUsing分别指定了两个自定义的序列化和反序列化类,用于实现货币单位的转换。在序列化时,我们将分转换为元,并输出了“RMB #.00”的格式;在反序列化时,我们将元转换为分。

三、Fastjson注解默认值

在进行反序列化时,当数据中缺乏某个属性时,Fastjson将使用Java中的默认值进行填充。但是,对于一些特定的业务需求,我们需要自定义默认值。此时,Fastjson提供了一种方便的方式。

public class MyBean {
    @JSONField(defaultValue="100.00")
    private BigDecimal amount;
    ...
}

在上面的例子中,我们使用了@JSONField注解,并传入了一个defaultValue值,用来指定自定义的默认值。如果数据中缺乏amount属性,则Fastjson将使用默认值“100.00”。

四、FastJson源码解析

阅读源代码是深入理解Fastjson注解的一种好方法。Fastjson的源代码非常优雅和简洁,而且注释详细,贴近业务,对于Java开发者来说阅读起来也非常舒适。

以以下代码为例:

public class MyBean {
    @JSONField(name="name", ordinal=1)
    public String name;
    @JSONField(name="age", ordinal=2)
    public int age;
    @JSONField(name="address", ordinal=3)
    public String address;
}

在上面的代码中,我们使用了@JSONField注解,并传入了一个name值和ordinal值。name值指定了序列化和反序列化时的属性名,ordinal值指定了序列化时的顺序。

阅读源代码可以更好的理解Fastjson注解的实现原理,能够更好的掌握Fastjson注解的使用技巧。

五、Fastjson日期注解

Fastjson的日期注解提供了一种方便的方式,用于格式化日期的输出。

public class MyBean {
    @JSONField(format="yyyy-MM-dd")
    public Date date;
    ...
}

在上面的代码中,我们使用了@JSONField注解,并传入了一个format字符串,用于指定日期的输出格式。

六、Fastjson注解BigDecimal

在默认情况下,Fastjson会使用带指数的科学计数法来输出BigDecimal类型的数据。如果我们想要保留完整的数据,Fastjson就提供了@JSONField注解,用于选择输出方式。

public class MyBean {
    @JSONField(numericToString=true)
    public BigDecimal amount;
    ...
}

在上面的代码中,我们使用了@JSONField注解,并传入了numericToString=true值,用于指定输出方式为完整的数值。

七、Fastjson常用注解

除了上述几种注解,Fastjson还提供了一些常用的注解。

  1. @JSONField(deserialize using=xxxx.class, serialize using=yyyy.class):用于指定自定义的序列化和反序列化类。
  2. @JSONField(name=xxxx, ordinal=xxxx, format=xxxx):用于指定序列化和反序列化时的属性名、顺序、格式。
  3. @JSONField(jsonType=xxx.class):用于指定一个不同于当前类的类型来操作序列化。

八、Fastjson注解反序列化false不生效

在Fastjson 1.2.23版本及之前,当实体类的成员变量设为false时,Fastjson在反序列化时并不会忽略这个属性。为了避免这个问题,可以采用以下方式解决:

public class MyBean {
    @JSONField(deserialize=false)
    public boolean deleted;
    ...
}

九、Fastjson最新版本

Fastjson目前的最新版本为1.2.75,同时也推出了beta版本2.0。

Fastjson在性能、功能、易用性等方面都有着非常高的评价,在各个业务场景中都有广泛的应用。Fastjson注解则是Fastjson不可或缺的一部分,通过使用注解,我们可以非常方便的控制序列化和反序列化的数据格式。