2016-04-12 20 views
1

私は現在AWSラムダを使用していますが、私は奇妙な動作に問題があります。 microservicesがオブジェクトのリストを返す場合、すべてのアイテムをListにキャストして取得できます。JSONからオブジェクトを取得できません

JSON:

{ 
    "payload": [ 
     { 
     "id": 35, 
     "start": { 
     "year": 2016, 
     "month": "OCTOBER", 
     "dayOfMonth": 10, 
     "dayOfWeek": "MONDAY", 
     "era": "CE", 
     "dayOfYear": 284, 
     "leapYear": true, 
     "monthValue": 10, 
     "chronology": { 
      "id": "ISO", 
      "calendarType": "iso8601" 
     } 
     }, 
     "end": { 
     "year": 2016, 
     "month": "OCTOBER", 
     "dayOfMonth": 10, 
     "dayOfWeek": "MONDAY", 
     "era": "CE", 
     "dayOfYear": 284, 
     "leapYear": true, 
     "monthValue": 10, 
     "chronology": { 
      "id": "ISO", 
      "calendarType": "iso8601" 
     } 
     }, 
     "user": "admin" 
    } 
    ] 
} 

この

return (List<Delegation>) response.getBody().getPayload(); 

のような単純なコードで、私は全体のリストを取得しています。 ResponseClassは

public class ResponseClass <T> { 

    private T payload; 

    public ResponseClass() { } 

    public void setPayload(T payload) { 
     this.payload = payload; 
    } 

    public T getPayload() { 
     return payload; 
    } 
} 

非常に単純ですが、私はペイロードに単一のオブジェクトを受信して​​いたときに奇妙なことが起こります

ので、今 JSON:

{ 
    "payload": { 
    "id": 35, 
    "start": { 
     "year": 2016, 
     "month": "OCTOBER", 
     "dayOfMonth": 10, 
     "dayOfWeek": "MONDAY", 
     "era": "CE", 
     "dayOfYear": 284, 
     "leapYear": true, 
     "monthValue": 10, 
     "chronology": { 
     "id": "ISO", 
     "calendarType": "iso8601" 
     } 
    }, 
    "end": { 
     "year": 2016, 
     "month": "OCTOBER", 
     "dayOfMonth": 10, 
     "dayOfWeek": "MONDAY", 
     "era": "CE", 
     "dayOfYear": 284, 
     "leapYear": true, 
     "monthValue": 10, 
     "chronology": { 
     "id": "ISO", 
     "calendarType": "iso8601" 
     } 
    }, 
    "user": "admin" 
    } 
} 

まったく同じもの(その横にあること現在はリストにない) と同じ方法でキャストしようとしているとき

(Delegation) response.getBody().getPayload(); 

クラスキャスト例外が発生しました。私のタイプにjava.util.LinkedHashMapをキャストできません。

だから、私は、ユーザージャクソンマッパーに試してみました:

mapper.convertValue(response.getBody().getPayload(), Delegation.class); 

が、私は

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected START_ARRAY: Expected array or string. 
at [Source: N/A; line: -1, column: -1] (through reference chain: xxx.Delegation["start"]) 
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:216) 
at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:962) 
at xxx.util.JSR310LocalDateDeserializer.deserialize(JSR310LocalDateDeserializer.java:61) 
at xxx.util.JSR310LocalDateDeserializer.deserialize(JSR310LocalDateDeserializer.java:17) 

xxxエラーを受けてるだけでプライバシーのためです。 jhipsterによって生成されたコードを使用しています。省略

委任クラス

public class Delegation { 

    private Long id; 

    private String user; 

    private LocalDate start; 

    private LocalDate end; 
} 

セッターとゲッター。

私はちょうど入力がLOCALDATE(java.lang.IllegalArgumentExceptionが変換され mapper.convertValue(input.get("start"), LocalDate.class);

やるしようとすると、同じエラーが発生します。予期しないトークン(START_OBJECT)は、START_ARRAY予想:予想される配列や文字列を [ソースで:N/A;行:-1、列:-1])

+1

実行時にタイプがバインドされている「Tペイロード」とは何ですか? 'ResponseClass'のインスタンスはどのように作成されますか? –

+0

@Meikoねえ、TペイロードをObjectペイロードに切り替えましたが、何も変わりません。 RestTemplateによって作成されます。 ResponseEntity レスポンス= template.postForEntity( "エンドポイント"、リクエスト、ResponseClass.class); – user3212350

+1

結果の 'java.util.LinkedHashMap'(' response.getBody()。getPayload() 'の結果)を分析できますか?それは期待された構造を持っていますか? –

答えて

0

最初のJSONでは​​が配列で、Listに変換されます。 2番目のJSONでは、​​がオブジェクトです。それをListに変換できないのは不思議ではありません。そのオブジェクトを単一のObjectとして収集し、Listの内部にあることが望ましい場合は、Listに追加する必要があります。

+0

を追加しましたか?私はそれをリストに変換しようとはしていない – user3212350

関連する問題