一、Fastjson注解有哪些
Fastjson注解是一种使用Java注解的方式,用于方便的控制序列化和反序列化的数据格式。Fastjson注解包含以下几种:
- @JSONField:用于控制序列化和反序列化的属性名、格式、顺序等。
- @JSONType:用于控制类级别的序列化和反序列化配置,包含序列化和反序列化的过滤器、序列化的顺序等。
- @JSONCreator:用于指定一个自定义的构造函数,用于反序列化。
- @JSONPOJOBuilder:用于指定一个自定义的Builder类,用于反序列化。
- @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还提供了一些常用的注解。
- @JSONField(deserialize using=xxxx.class, serialize using=yyyy.class):用于指定自定义的序列化和反序列化类。
- @JSONField(name=xxxx, ordinal=xxxx, format=xxxx):用于指定序列化和反序列化时的属性名、顺序、格式。
- @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不可或缺的一部分,通过使用注解,我们可以非常方便的控制序列化和反序列化的数据格式。