2016-06-21 22 views
1

RestTemplateを使用してRESTサービスを使用しようとしています。 JSONレスポンスをデシリアライズするのに問題があります。カスタムDeserializerを使用していますが、JSONには3つのノードがありますが、デシリアライザに到達するのは1つだけです。以下は詳細です。以下はRestTemplate - Jackson Deserializer

レスポンスJSONは次のとおりです。

{ 
    "Hello": { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    }, 
    "Hello": { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    }, 
    "Hello": { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
} 

私は@JsonDeserializerを使用して属性こんにちはためレスポンスクラスのカスタムデシリアライザを使用しています。

iは以下のようreadTreeを行う:

JsonNode node = jp.getCodec().readTree(jp); 

それは以下のように唯一のノードの代わりに3を有しているように見える、デシリアライズする方法に到達します。場合によっては最初のノードがあり、時には最後のノードもあります。ここで何がうまくいかないのでしょうか?

この質問をご覧になり、助けてくれてありがとうございます!

ANSWER: 他にも述べたように、このJSONは無効であるため、ジャクソンはそれをデシリアライズできません。レスポンスをStringとして取得して、手動で逆シリアル化する必要がありました。

答えて

1

JsonNodeは、特定のコンテンツ動作を持たないスーパークラスです。あなたの例では、ObjectNodeを取得する必要がありますが、プロパティの名前がす​​べて同じであるため、「Hello」プロパティは1つだけ残ります。 readTree()は、可能な場合に必要な戻り値の型に自動キャストする一般的なメソッドです。

あなたは本当にあなたが配列構造にあなたのJSONを移動する必要があり、これを必要とする場合:

// you will get one ArrayNode containing multiple ObjectNode 
[ 
    { 
    "Hello": { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    } 
    }, 
    { 
    "Hello": { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    } 
    }, 
    { 
    "Hello": { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
    } 
] 

または

// you will get one ObjectNode containing one property with an ArrayNode 
{ 
    "Hello": [ 
    { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    }, 
    { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    }, 
    { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
    ] 
} 
+0

私は現在、本番環境に存在し、他の場所で使用されているサービスを消費しています。応答を受け取った後、JSONを配列に変換できますか? – mandy

+0

申し訳ありませんが、ObjectNodeが一意のキーを持つと見なされるため、Jackson imhoではこれが動作しません。 –

+0

これを行う唯一の方法は、ツリーメソッドを使用せずに、代わりに 'getCurrentToken()'、 'get ... Value()'と 'nextToken()'を使って解析する完全カスタムのデシリアライザです。リストまたはマルチマップタイプを解析します。たくさんの仕事がありますが、最後には働くことができます。 –

1

これは無効なJSONである可能性が高いため、同じ名前のノードを3つ持つことはできません。

厳密にはJSONオブジェクトの項目のみのために、項目の順序を保証するものではありませんので、悪いですが、エラーという名前「こんにちは」as stated in this answer計上されるアイテムの一つだけ、ではありません話しますリスト内の。

応答を変更する可能性がある場合は、代わりにオブジェクトの配列を作成します。

{ "Hello": [ { "Hi": "Name1", "Call": "PhoneNumber1" }, { "Hi": "Name2", "Call": "PhoneNumber2" }, { "Hi": "Name3", "Call": "PhoneNumber3" } ] } 次に、繰り返し処理できるJsonNodeの配列であるJsonNodeを取得します。

+0

私は今日、生産に存在するサービスを消費していますし、その他に使用されています場所。応答を受け取った後、JSONを配列に変換できますか? – mandy

+0

多分この答えはあなたを助けることができます:http://stackoverflow.com/questions/27710471/java-json-with-duplicate-keys-to-map-using-jackson、そこにコメントを読むことを確認してください:) –

+0

ありがとう@ダニエル、私はグアバを試し、ここでそれを更新します。 – mandy

関連する問題