【问题标题】:Jersey Jackson JSON deserialization of response entity results in blank fields响应实体的 Jersey Jackson JSON 反序列化导致空白字段
【发布时间】:2014-07-10 08:01:41
【问题描述】:

我遇到了一个问题。当我的 POJO 被 Jersey 客户端通过调用反序列化时

jersey.api.ClientResponse#getEntity(OrderCostSummary.class)

响应 json 中的所有字段,即 subTotal、shippingCost、tax 和 total 均为 null。

我最初认为这将是与 Money 类有关的问题,即 ObjectMapper 不知道如何反序列化此类,但我有其他 api 调用返回响应实体,其中包含反序列化没有任何问题的 Money 字段。

这是从服务器返回的 JSON:

{ "orderCostSummary":{
  "subTotal":{
     "amount":"9.99",
     "currency":"GBP"
  },
  "shippingCost":{
   "money": {
     "amount":2.95,
     "currency":"GBP"
     }
  },
  "tax":{
     "amount":0,
     "currency":"GBP"
  },
  "total":{
     "amount":12.94,
     "currency":"GBP"
  }}}

POJO

public class OrderCostSummary {
private Money subTotal;
private Money shippingCost;
private Money tax;
private Money total;

/**
 * Instantiates a new Order cost summary.
 */
public OrderCostSummary() {
}

public Money getSubTotal() {
    return subTotal;
}

public void setSubTotal(Money subTotal) {
    this.subTotal = subTotal;
}

public Money getShippingCost() {
    return shippingCost;
}

public void setShippingCost(Money shippingCost) {
    this.shippingCost = shippingCost;
}

public Money getTax() {
    return tax;
}

public void setTax(Money tax) {
    this.tax = tax;
}

public Money getTotal() {
    return total;
}

public void setTotal(Money total) {
    this.total = total;
}

public class Money {
private BigDecimal amount;
private Currency currency;

我的钱POJO

public Money() { }

public Money(BigDecimal amount, Currency currency) {
    this.amount = amount;
    this.currency = currency;
}

public BigDecimal getAmount() {
    return amount;
}

public void setAmount(BigDecimal amount) {
    this.amount = amount;
}

public Currency getCurrency() {
    return currency;
}

public void setCurrency(Currency currency) {
    this.currency = currency;
}

【问题讨论】:

  • 这听起来很像错误的反序列化尝试转换不是 OrderCostSummary 的对象。不过,我想知道添加 @JsonProperty 注释是否会有所帮助。

标签: java rest jersey deserialization


【解决方案1】:

看来你的结构并不总是一样的:

这个结构:

{
   "orderCostSummary":{
      "subTotal":{
         "amount":"9.99",
         "currency":"GBP"
      },
      "shippingCost":{
         "amount":2.95,
         "currency":"GBP"
      },
      "tax":{
         "amount":0,
         "currency":"GBP"
      },
      "total":{
         "amount":12.94,
         "currency":"GBP"
      }
   }
}

与此结构不同:

{
   "orderCostSummary":{
      "subTotal":{
         "money":{
            "amount":"9.99",
            "currency":"GBP"
         }
      },
      "shippingCost":{
         "money":{
            "amount":2.95,
            "currency":"GBP"
         }
      },
      "tax":{
         "money":{
            "amount":0,
            "currency":"GBP"
         }
      },
      "total":{
         "money":{
            "amount":12.94,
            "currency":"GBP"
         }
      }
   }
}

【讨论】:

  • 对不起@Basemasta 我意识到我将money元素添加到json中是为了尝试解决这个问题,并且在将它发布到这里时不小心把它留下了。我已经设法让它工作了。我会更新我的答案
【解决方案2】:

如果你试试这个:

public class OrderCostSummary implements Serializable {
    @JsonDeserialize(as=Money.class)
    private Money subTotal;
    //And do the same with other fields.
    ...
}

请注意,我添加了“实现可序列化”,这对于序列化/反序列化的 POJO 更好

【讨论】:

    【解决方案3】:

    答案是下面的 json 应该已经被调用反序列化了

    jersey.api.ClientResponse#getEntity(ClassThatHoldsOrderCostSummary.class)
    

    一旦对象被反序列化,我就可以调用

    classThatHoldsOrderCostSummary.getOrderCostSummary()
    

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 2011-07-30
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多