構文解析JSONへの地図<String, Entity=""> とFlexJSON
-
28-09-2019 - |
質問
うことにより解析のためには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>