2015-03-13 19 views
1

我有以下需要解析的JSON代碼。我正在使用相應的JAX-RS模型。問題是paymillClient對象爲空。如果我在PaymillSubscription對象內添加currency作爲字符串,它將返回EUR值,而不是null。因此,PaymillClient對象似乎存在問題,而不是普通的字符串。對於解析嵌套對象的數量是否有限制? Ex,最多2個嵌套對象。所以,因爲在我的情況下有3個,它不起作用。Jersey JAX-RS 3級嵌套對象具有空值

不幸的是,我無法更改需要解析的JSON代碼。我只需要使它與JAX-RS實現一起工作。

{ 
    "event":{ 
     "event_type":"subscription.succeeded", 
     "event_resource":{ 
     "subscription":{ 
      "id":"sub_29f144a3bc32c71f96e2", 
      "offer":{ }, 
      "livemode":false, 
      "amount":200, 
      "temp_amount":null, 
      "currency":"EUR", 
      "name":"Monthly subscription", 
      "interval":"1 MONTH", 
      "trial_start":null, 
      "trial_end":null, 
      "period_of_validity":null, 
      "end_of_period":null, 
      "next_capture_at":1428939744, 
      "created_at":1426264944, 
      "updated_at":1426264944, 
      "canceled_at":null, 
      "payment":{ }, 
      "app_id":null, 
      "is_canceled":false, 
      "is_deleted":false, 
      "status":"active", 
      "client":{ 
       "id":"client_c0c24aa7f97e1b8ed15d" 
      } 
     }, 
     "transaction":{ } 
     }, 
     "created_at":1426264944, 
     "app_id":null 
    } 
} 

PaymillEventContainer:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class PaymillEventContainer 
{ 
    private PaymillEvent event; 
} 

PaymillEvent:

@XmlAccessorType(XmlAccessType.FIELD) 
public class PaymillEvent 
{ 
    @XmlElement(name = "event_type") @DocumentationExample(value = "subscription.succeeded") private String eventType; 
    @XmlElement(name = "event_resource") private PaymillEventResource eventResource; 
} 

PaymillEventResource:

@XmlAccessorType(XmlAccessType.FIELD) 
public class PaymillEventResource 
{ 
    private PaymillClient client; 
    private PaymillOffer offer; 
    private PaymillSubscription subscription; 
} 

PaymillSubscription:

@XmlAccessorType(XmlAccessType.FIELD) 
public class PaymillSubscription 
{ 
    private PaymillClient client; 
    private PaymillOffer offer; 
} 

PaymillClient:

@XmlAccessorType(XmlAccessType.FIELD) 
public class PaymillClient 
{ 
    @DocumentationExample(value = "client_c0c24aa7f97e1b8ed15d") private String id; 
} 

API端點代碼:

public Response postSubscriptionSucceeded(PaymillEventContainer paymillEventContainer) 
    { 
     PaymillEvent paymillEvent = paymillEventContainer.getPaymillEvent(); 
     PaymillEventResource paymillEventResource = paymillEvent.getEventResource(); 

     PaymillSubscription paymillSubscription = paymillEventResource.getSubscription(); 
     PaymillClient paymillClient = paymillSubscription.getPaymillClient(); 
     PaymillOffer paymillOffer = paymillSubscription.getPaymillOffer(); 

     String clientId = paymillClient.getId(); // NullPointerException 
} 
+0

您能否給我們列出PaymillSubscription? – mkrakhin 2015-03-13 19:38:19

+0

我的不好,忘了PaymillSubscription,它也有PaymillClient。所以這不是問題。編輯並添加了PaymillSubscription。PaymillEventResource和PaymillSubscription都包含PaymillClient,因爲有兩個不同的API端點可以返回任何一個對象中的客戶端(我知道,並不漂亮,但這不取決於我)。無論哪種方式,PaymillClient在兩種情況下均爲null。 – 2015-03-13 19:38:57

+0

不應該在paymillSubscription而不是getPaymillClient()上調用getClient()? – mkrakhin 2015-03-13 19:52:59

回答

2

確定。我試圖在你的機器上運行你的代碼,並且也收到了null(注意,我使用MOXy來解組JSON)。然後,我試着嘗試一下,發現了很有趣的東西:

1.如果您將刪除JSON中的所有空值字段,那麼所有的工作都是完美的。

2.如果您將另一個字段添加到PaymillSubscription。我加入私人測試測試中,測試是:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Test { 
    private String id; 
} 

,並會在認購對象發出最後的空值字段之間的這種「測試」對象和「客戶端」字段:

"test":{"id":"sadas"}, 
"client":{ 
    "id":"client_c0c24aa7f97e1b8ed15d" 
} 

然後「測試「將爲空,但」客戶端「將按預期進行解析。

3.如果你將所有的空值對象添加到模型(我的意思是,在PaymillSubscription類中創建相應的字段),所有的作品都很完美。

看來,默認情況下,JAXB規範不允許JSON與無法識別的字段,但MOXy仍然試圖解析它(有時會產生錯誤)。

+0

1)你的意思attrs像app_id和canceled_at?如果是這樣,就像我說的,我根本無法改變請求JSON。 2)在JSON中添加測試模型?我猜想與1相同,不能更改JSON。 3)我認爲這是可行的,我現在就試一試。 – 2015-03-13 20:53:47

+0

是的。你可以試試我在2)或3)中寫的內容。 – mkrakhin 2015-03-13 20:54:40

+0

大聲笑,它看起來它使用你的第三個想法。很好地找到解決方案,但爲什麼地獄它不工作與模型中沒有聲明的空值?只是澤西島內的一個bug? – 2015-03-13 21:09:04