質問

うことにより解析のためにはJSONと同様の構造を有す:

    {
 "cars": {
  "112": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1998"
  },
  "642": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1990"
  },
  "9242": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "2001"
  }
 }}

いCarEntityって定義されたクラスmakeName、モデル、定義されている属性とアクセス可能なgetter/setterか.

うことにより直列化復元このJSONのようになります:

    Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json);

が、うまくいきませんで:その他の直列化復元)しますがい Map<String, CarEntity> も深い地図のようなもの Map<String, Map<String, Map<String, String>>> )

なぜですか?

役に立ちましたか?

解決

JSONには2つのマップがあることです。 「車」キーを含むもの、そして実際の介護を含むもの。残念ながら、マップ内の単一のキーを参照して、現時点ではそのキーだけにタイプを割り当てることはできません。通常、コレクションの値にタイプを設定することは、コレクション内のすべての値を指します。 「車」キーを含む最初のマップのタイプを指定する必要はありません。

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
    .use("values.values", CarEntity.class )
    .deserialize(json).get("cars");

パス「値」とは、外側マップの値を指し、次のマップ値を横断することはすべてCarentityインスタンスです。

私は、パス式をより表現力豊かであることを検討し、コレクションの単一の値をターゲットにすることができますが、これにより、それらを評価し、後方に互換性があることのオーバーヘッドが増加します。

他のヒント

すると噛まれるJava Typeを消去:JSONライブラリか知らないタイプしたい;すべてのトヨタグループをはじめ、世界の当たりに換算すると地図です。で指定する必要があります少なくとも価値の型がなんだか。今FlexJSON書類で行われたトークイベント.

することができるサブクラスHashMap自分タイプ(MyEntityMap extends HashMap)、それ以降ータからも推し量ることができ汎用スーパータイプ過MyEntityMap.class うタイプの情報になるJSONライブラリを使用でき(ジャクソンとGSON少なくとも).

これらが働いていない方は、ジャクソンとGSON図書館に対応でき、本利用の場合は、両方の指定は汎用型の直列化復元.

もう1つ電話してください get("cars") お気に入り:

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json).get("cars");

JSON文字列は、おそらく変数からシリアル化されました cars ASと入力 Map<String, CarEntity>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top