Jersey Json Deserialize - Boolean , Enum

来源:互联网 发布:多力甾醇玉米油知乎 编辑:程序博客网 时间:2024/05/23 17:42

新手第一次接触 通过Jersey搭建RESTFul服务, 在前端传过来的Json转化为POJO的时候遇到了 一些问题, 主要是 Boolean, Enum 的转化。

public class TestDO {     private boolean isStore;     private ExecMode mode;}
enum Execmode {     HIVE , SHARK} 

出错的POJO定义如上,传过来的Json为 

{    "isStore":true,    "mode":"HIVE"}
这样总是报错,isStore not marked as ignorable</span>

去掉 isStore, mode 会报错 value not one of declared Enum instance names 等等;

由于第一次接触,不是很熟悉,所以通过各种 stackoverflow 找到了一些原因:
1. boolean类型 deserialize 的时候需要指定它的类型,即加上注释:@JsonDeserialize( as = Boolean.class ), 那声明的时候也只能用 Boolean.
2. enum犯错更低级了,因为HIVE,SHARK的值是 0,1 ,所以Json里对应字段的值应该是 0,1, 而不是HIVE,SHARK字符串, 如果要传字符串的形式(能够很好理解含义,一般这种方式吧),需要对enum定义做出修改如下:

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">enum ExecMode {</span>
    HIVE("HIVE"),    SHARK("SHARK");    private final String value;    @JsonCreator    private ExecMode(final String description) {        this.value = description;    }    @JsonValue    final String value() {        return this.value;    }}

将HIVE,SHARK的值指定为字符串,然后在构造函数,value函数分别加上 @JsonCreator, @JsonValue的注释

通过上述的修改, 前段传输 :
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">{</span>
    "isStore":true,    "mode":"HIVE"}
</pre><pre name="code" class="html">
</pre><pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">就不会有问题了。</span>

0 0
原创粉丝点击