将@JsonCreator与嵌套的Json对象一起使用时遇到问题

时间:2015-03-26 20:35:28

标签: java json jackson

我有一些旧的代码工作正常,但现在我想在域对象中使用@JsonCreator,我能够重新考虑所有的东西,但我现在陷入了一个问题。在一个场景中,我有Json Structure,如:

  [{
    "name" : "John",
    "emailAddress" :"stucked@gmail.com" 
  }]

但是在java后端我的结构如下:

class Employee {
    public final String name;
    public final EmailAddress emailAddress;

    Employee(final String name, final EmailAddress emailAddress) {
        this.name = name;
        this.emailAddress = emailAddress;
    }

    Employee() {
        this(null, null)
    }
 }

class EmailAddress {
   public final String address;

   EmailAddress(final String address) {
       this.address = address;
   }

   EmailAddress() {
      this(null);
   }
}

所以我想尝试:

class Employee {
    public final String name;
    public final EmailAddress emailAddress;

    @JsonCreator
    Employee(@JsonProperty("name")final String name, 
             @JsonProperty("emailAddress")final EmailAddress emailAddress) {
        this.name = name;
        this.emailAddress = emailAddress;
    }
}    

class EmailAddress {
   public final String address;

   @JsonCreator
   EmailAddress(@JsonProperty("address")final String address) {
       this.address = address;
   }
}

现在的问题是在Employee域对象中使用@JsonProperty和“emailAddress”字段,然后在带有“地址”的EmailAddress对象中使用@JsonProperty,因为在Json中我没有任何“地址”属性,并且由于哪个JsonParsing错误即将来临。

如果我将emailAddress声明为String而不是EmailAddress并删除EmailAddress对象,那么很容易解决问题,但很多其他地方都使用了EmailAddress对象的地址字段,修改需要付出很多努力,而且有很多这样的情况。有没有其他解决方案?

1 个答案:

答案 0 :(得分:0)

那么你的问题到底是什么?如果目标是允许这两个:

"stucked@gmail.com" 
{ "address" : "stucked@gmail.com" }

它应该已经有效了:Jackson发现如果找到JSON String,可以使用单字符串构造函数;和setters / fields如果找到JSON对象。您只需要确保名称匹配(“地址”与“电子邮件地址”)。