当前位置: 首页 > 知识库问答 >
问题:

Jersey Jackson JSON响应实体反序列化结果显示在空白字段中

刘和正
2023-03-14

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

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

响应json中的所有字段,即小计、发货成本、税和总计都为空。

我最初认为这与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"
  }}}

波乔

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;
}

共有3个答案

杨凯旋
2023-03-14

答案是以下json应该与调用一起反序列化

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

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

classThatHoldsOrderCostSummary.getOrderCostSummary()
孔梓
2023-03-14

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

此结构:

{
   "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"
         }
      }
   }
}
姬飞飙
2023-03-14

如果您尝试以下方法:

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

注意,我添加了“implements Serializable”,这对于序列化/反序列化的POJO更好

 类似资料:
  • 问题内容: 有什么办法可以在输入字段中显示ajax响应?谢谢 问题答案: 是。 使用jQuery,它看起来像:

  • 我重构我的代码来使用kryo序列化。一切都很好,除了从某个类中反序列化一个土工属性。不会引发异常(我将“spark.kryo.registrationRequired”设置为true)。在调试时,我试图收集数据,但我看到geomtry中的数据只是空的。结果,我明白反序列化失败了。Geomtry来自-Any(scala)类型,因为它可能是一个复杂的属性。我的问题是为什么数据是空的,以及是否与属性的类

  • 它似乎只是简单地删除了转义字符,将一些空字符串转换为空字符串,并将整个内容包装在一组额外的花括号中。就像它被反序列化为不同的序列化格式一样。 在其他SO问题中,答案建议创建一个类来反序列化: 但当我这么做的时候,我得到了一个例外: 我需要一种方法来引用这个响应中的名称和Employee_ID。我对JSON比较陌生。

  • 我有一个带有lombok注释的POJO,我的JSON通过Jackson将它反序列化,如下所示: 当jackson试图反序列化仅列出一个响应时 缺少什么来确保所有属性要么包含反序列化JSON中的相应值,要么包含默认分配值的空列表? -更新-这不是问题,直到我从Spring 1.3.5升级到1.4.2,这也将我的Jackson版本从2.6.6升级到2.8.4

  • 问题内容: 我必须从数据库中提取客户列表,但是如果第二个地址字段为空,我想显示文本“ None Provided”。这是我的查询: 如果地址2为空白,我想显示“无提供”。我怎么做?我敢肯定答案非常简单,但是我脑子屁,在任何地方都找不到答案。 好的,这就是我最终要进行的工作: 有没有更好的方法来实现这一目标? 问题答案: 您可以使用: 甚至更好: 如果数据包含空字符串或null,那么我将考虑使用: