3

Jackson ライブラリを使用してGeoJSON JSON オブジェクトを逆シリアル化する必要があります。この json オブジェクトには、これが適用される場所があります

"type" : "name"  

次の json オブジェクトは 1 つのタイプです。たとえば、次のように言います。

"properties": {
   "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}  

一方、もしあれば

"type": "link"  

次の json オブジェクトは別の型です。たとえば、次のように言います。

"properties": {  
   "href": "http://example.com/crs/42",  
   "type": "proj4"  
}  

これで、次を含む PropertiesPOJO が作成されました。

private String name;  
private String href;
private String type;

現在のソリューションでは、オブジェクトのタイプを確認する必要があるため、PropertiesPOJO のどの部分を考慮する必要があるかがわかります。これは良い習慣ではありません。NamePropertiesPOJO または LinkPropertiesPOJO に直接逆シリアル化するカスタム デシリアライザーを使用してこれを行うことをお勧めします。私が持っていた1つのアイデアは、配置することです

@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
NamePropertiesPOJO namePropertiesPOJO = null;

@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
LinkPropertiesPOJO linkPropertiesPOJO = null;

しかし、私は

JsonMappingException が発生しました: プロパティ "properties" を表す複数のフィールド:

それで、ジャクソンの注釈を使用してこれをもっとオブジェクト指向にする方法は他にありますか?

敬具、
デスポット

4

3 に答える 3

2

これは「外部型 ID」として知られており、Jackson ではまだサポートされていませんが (オブジェクトに埋め込まれた型識別子とは異なり、この場合は 1 つの追加プロパティとして)、サポートを追加する必要があるものです。JACKSON-453によると、将来。1.8 では実現しませんが、それ以降のバージョンでは実現することを願っています。GeoJSON は、これに対して一般的に繰り返されるユース ケースです。より一般的なメカニズムを選択していればよかったのですが、フォーマットの人気により、これはサポートする優先度が高いものです。

于 2011-04-14T16:57:22.667 に答える
0

あなたはそれを介してそれを行うことができるはずです

class Pojo {
    Map<String,String> properties;
    ...
}

そして、マップから内容を読み取るだけです。

また、注釈なしで示した POJO を持っているだけの場合、Jackson は適切な変数を自分で入力できるはずです。セッターでは、これがタイプ1またはタイプ2であるフラグを設定できるため、次のことができますif (pojo.isType1())

于 2011-04-13T13:20:14.903 に答える
0

簡単な答えは、条件付きデシリアライゼーション ジャクソン json 戦略はありません。

乾杯、
専制君主
PS: 誰かが私に問題の解決策を教えてくれたら (「いいえ」以外)、私は喜んで回答チェックを彼の回答に転送します!

于 2011-04-14T09:21:12.610 に答える