質問
Jacksonを使用して、JSONデータをJavaオブジェクトに変換しようとしています。これは、正確にはオブジェクトのリストですが、このエラーが発生します。
org.codehaus.jackson.map.jsonmappingexception:start_array tokenのentitylayer.detailのインスタンスをゆるくすることはできません。
これはコードです:
ObjectMapper mapper = new ObjectMapper();
List<Detail> lcd = (List<Detail>) mapper.readValue(ld, Detail.class);
Ld JSON形式のリストです。これは、私が快適になっている部分です ジャクソンチュートリアル. 。何をしますか 新しいファイル( "user.json") 代表する?私はそれが私が変換したいJSON形式の文字列だったと思いました、だから私は使用しました Ld.
私はあなたがそれで私を助けることができることを願っています
解決
リンクしたチュートリアルから(他のコレクションは同じように機能します):
したがって、データをマップにバインドする場合は、使用する必要があります。
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
一般的なタイプの定義を渡すためにのみ型が必要である場合(この場合、anyNomous Innerクラスを介して):重要な部分は、バインドするタイプを定義する>です。
これを実行しない場合(およびMap.classをパスするだけ)、上記のように、コールはMAP(つまり「Untyped」マップ)にバインディングすることに相当します。
編集:
あなたがスプーンを与えられることを主張する場合:
List<Detail> lcd = mapper.readValue(ld, new TypeReference<List<Detail>>() {});
他のヒント
別の戦略として、タイプを簡単に指定できるため、配列を扱うことはやや便利です。したがって、これを行うこともできます。
Detail[] details = mapper.readValue(ld, Detail[].class);
少なくともジャクソンを扱うとき、アレイはしばしば使用されていません。結果をあまり変更する必要がない限り、使用するのに非常に便利です。ジェネリックを使用する必要なくタイプはうまく封じ込められているためです(結果として、タイプセーフティは強力です。それは単なるコンパイラの綿毛ではありません)。
または、JSONを自分で解析し、作成したいポジョーを作成します。私はJSONをJaxBに変えるためにそれをしました。
の「ストリーミングAPI例」セクションを参照してください http://wiki.fasterxml.com/jacksoninfiveminutes
予想よりも簡単です。
このエラーが発生するたびに、最初に変換しようとしているJSON文字列が適切なJSON文字列であるかどうかを確認します。コードをテストするために独自のJSON文字列を作成しようとすると、このエラーを取得することになります。