19

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を使用しました。

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

4

4 に答える 4

19

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

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

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

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

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

編集:

スプーンで食べさせたい場合:

List<Detail> lcd = mapper.readValue(ld, new TypeReference<List<Detail>>() {});
于 2010-12-08T21:43:07.723 に答える
12

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

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

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

于 2010-12-10T18:51:02.583 に答える
0

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

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

思ったより簡単です。

于 2013-02-08T09:15:01.367 に答える
0

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

于 2013-06-13T07:14:10.953 に答える