Java Enum 与 Json 的互相转换
在Java中使用Enum的频率很高,我们也经常使用 Enum 作为类的一个属性定义。那么如果需要将Enum转换成Json或者将Json传转换成Enum该怎么操作了?接下来我们看一下。Enum序列化成Json的几种方式。
本实例使用的是
jackson
的包,用的是ObjectMapper
.
首先我们定义一个类Instance
,里面有一个Enum
的参数: state ; 在这里我们为了方便观察几种不同 Enum 的json序列化方式,state定义为Object
,Instance
类定义如下;
1 | package me.chenzhijun.enumjson; |
原生Enum
这种我们通常是不做任何改动,就一个普通的定义Enum:
1 | package me.chenzhijun.enumjson; |
在这种方式下,我们可以看一下转换成json后的输出:
1 |
|
运行之后可以看到结果为:
1 | {"state":"SUCCESS","name":"《Java枚举类-json》"} |
在这种情况下,Enum默认使用的是enum.name()
来作为json的值。
使用 Enum 的所有属性值作为json值
有时候我们可以让Enum像一个普通类一样,json序列化的时候将其中的所有属性都能输出,可以使用的方式是在Enum的定义上加上@JsonFormat(shape = JsonFormat.Shape.OBJECT)
,代码如下:
1 | package me.chenzhijun.enumjson; |
测试方法如上,输出的结果为:
1 | { |
使用Enum的某一个属性作为json值
有时候我们可能想要使用Enum中定义的某一个自定义属性的值,只需要在属性的get
方法上使用@JsonValue
即可满足需求。
1 | package me.chenzhijun.enumjson; |
测试方法如上,输出的结果为:
1 | { |
可以看到与原生的Enum相比,state的值变成了我们在Enum中定义的value
。注意值的大小写。
自定义序列化结果
有时候我们还可能想更高级一点,那么就可以自定义序列化结果。比如Enum的属性num
,原本是int
类型,但是我们就是想让它变成一个String
类型,或者我不想要Enum其中的某一个变量。那么可以自己实现序列化接口:
1 |
|
这样我们定义了我们自己的特殊要求,之后再Enum的定义中进行指定,使用@JsonSerialize(using = StateSerializer.class)
:
1 | package me.chenzhijun.enumjson; |
测试方法如上,输出的结果为:
1 | { |
附上所有的测试方法:
1 | package me.chenzhijun.enumjson; |
这样,Enum的Json转化就可以任君”宰割”了~~
如果是Json串转Java类型,就把上面的方式换过来即可。比如上一个测试类中的:
1 | String json = "{\"state\":{\"value\":\"success\",\"num\":1},\"book_name\":\"《Java枚举类-json转换》\"}\n"; |
嗯嗯~全文完~