多个JsonCreator注释方法

时间:2017-10-17 15:02:03

标签: java jackson

初步问题

是否可以有多个@JsonCreator方法,并且杰克逊可以根据方法定义来检测它应该使用哪个方法?

@JsonCreator
public static StateOfComm factory(String id) {
    return StateOfComm.valueOf(id);
}

@JsonCreator
public static StateOfComm factory(CustomType value) {
    return StateOfComm.valueOf(value.getId());  
}

更新

失败的JSON(因为id = null)如下:

{"comment":null, "processes":[{"stateOfComm":{"id":"CA"}}]}

以下作品:

 {"comment":null, "processes":[{"stateOfComm":"CA"}]}

3 个答案:

答案 0 :(得分:2)

我能够通过以下方式解析您问题中的两个JSON示例:

  1. 使用jackson-modules-java8版本2.9.1依赖
  2. 使用-parameters参数
  3. 调用java 8编译器
  4. 为所有涉及的类引入所有参数构造函数
  5. 在静态创建方法和构造函数上避免@JsonProperty
  6. 定义一个类:

    class CustomType {
        private final String id;
    }
    
  7. 我的理解是杰克逊无法辨别旧版本中的多个创作者。例如。请参阅答案here和github问题here。在这种情况下,似乎在java 8中编译代码中具有参数名称的选项有用。

答案 1 :(得分:1)

您可以拥有多个@JsonCreator方法,但需要使用@JsonProperty来指定要初始化的属性。

@JsonCreator
public static StateOfComm factory(@JsonProperty("id") String id) {
    return StateOfComm.valueOf(id);
}

@JsonCreator
public static StateOfComm factory(@JsonProperty("value") CustomType value) {
    return StateOfComm.valueOf(value.getId());  
}

答案 2 :(得分:0)

我通过摆脱const btn1 = document.querySelector('#btn1') btn1.addEventListener('click', (e)=>{ const textContent = e.target.textContent }) const btn2 = document.querySelector('#btn2') btn2.addEventListener('click', () => { console.log(textContent) }) 批注并使用自定义的@JsonCreator来解决了这个问题。

这里是一个例子:

StdDeserializer