web-dev-qa-db-ja.com

java

Jacksonを使用してJSONデータをJavaオブジェクト、正確にはオブジェクトのリスト)に変換しようとしていますが、次のエラーが発生します。

org.codehaus.jackson.map.JsonMappingException:START_ARRAYトークンからentitylayer.Detailのインスタンスを逆シリアル化できません

これはコードです:

 ObjectMapper mapper = new ObjectMapper(); 
 List<Detail> lcd = (List<Detail>) mapper.readValue(ld, Detail.class);

ldはJson形式のリストです。これは、 jacksonチュートリアル で私を混乱させる部分です。 new File( "user.json")は何を表していますか?それが変換したいjson形式の文字列だと思ったので、ldを使用しました。

あなたがそれで私を助けてくれることを願っています

19
eddy

リンクしたチュートリアルから(他のコレクションも同じように機能します):

したがって、データをマップにバインドする場合は、次を使用する必要があります。

Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });

typeReferenceは、ジェネリック型の定義を渡すためにのみ必要です(この場合は任意の内部クラスを介して):重要な部分は、バインドする型を定義する>です。

これを行わない場合(そしてMap.classを渡すだけの場合)、上記で説明したように、呼び出しはMap(つまり「型指定されていない」Map)へのバインドと同等です。

編集:

あなたがスプーンで与えられることを主張するならば:

List<Detail> lcd = mapper.readValue(ld, new TypeReference<List<Detail>>() {});
19
OrangeDog

別の戦略として、型を簡単に指定できるため、配列の処理が少し便利です。したがって、代わりにこれを行うこともできます:

Detail[] details = mapper.readValue(ld, Detail[].class);

少なくともジャクソンを扱うときは、配列はしばしば十分に活用されていません。結果をあまり変更する必要がない限り、ジェネリックを使用せずに型が適切に含まれているため、非常に便利に使用できます(その結果、型の安全性は強力です。コンパイラの綿毛だけではありません)。

12
StaxMan

または、JSONを自分で解析し、作成したいPOJOを作成します。 JSONをJAXBに変換するためにそれを行いました。

http://wiki.fasterxml.com/JacksonInFiveMinutes の「ストリーミングAPIの例」セクションを参照してください。

思ったより簡単です。

0
Gautam

このエラーが発生した場合は、最初に、変換しようとしているJSON文字列が適切なJSON文字列であるかどうかを確認してください。コードをローカルテストするために独自のJSON文字列を作成しようとすると、このエラーが発生します。

0
user2319311