2015-10-15 83 views
0

反序列化JSON字符串数组转换成不同的类型,我反序列化JSON一些这种格式:如何使用杰克逊

"devices": [ 
    { 
    "device": "1", 
    "type": "phone", 
    "number": "XXX-XXX-0100", 
    "name": "", 
    "capabilities": [ 
     "push", 
     "sms", 
     "phone" 
     "mobile_otp" 
    ] 
    }, 
    { 
    "device": "2", 
    "type": "token", 
    "name": "0" 
    } 
] 

我希望把“能力”为单独的对象类型。例如:推送,短信,电话,MobileOtp。我正在使用杰克逊反序列化这个,下面是我想到的,它的工作原理。但是,我想找到一种方法来设置它,不需要每次添加新的子类型时编辑父Capability类。有没有办法做到这一点,但仍然有杰克逊正确解析JSON?我尝试过使用模板方法或类似的方法,但似乎没有任何解决方案能与杰克逊解析器一起工作。有任何想法吗?

public abstract class Capability { 
    public static final Map<String, Capability> factoryMap = new HashMap<String, Capability>(); 

    static { 
     factoryMap.put("mobile_otp", new Passcode()); 
     factoryMap.put("phone", new Phone()); 
     factoryMap.put("push", new Push()); 
     factoryMap.put("sms", new Sms()); 
    } 

    @JsonCreator 
    public static Capability forValue(String value) { 
     return factoryMap.get(Strings.nullToEmpty(value).toLowerCase()); 
    } 
} 

public class MobileOtp extends Capability {} 
public class Phone extends Capability {} 
public class Push extends Capability {} 
public class Sms extends Capability {} 


public class Device { 
    @JsonProperty("capabilities") 
    private Collection<Capability> capabilities = new ArrayList<Capability>(); 

    // other stuff... 
} 
+0

这基本上是一个枚举 - 但你也需要处理其他值到达?当你收到你没有编码的能力时,你想要发生什么?是否应该有一个“其他”能力的子类来保存它? – araqnid

+0

是的,我不确定一个枚举是否会是一个更好的选择,但是可能会有其他功能添加到子类中 – acvcu

回答

0

而不是简单Map,为什么不指定Enum定义操作,然后为capabilities属性值类型EnumSet<OptionEnum>。它被序列化为JSON数组,并带有字符串值,就像你似乎想要的那样。