Retrofitレスポンスの一部としてJackson 2.8を使用してこのJSONオブジェクトを逆シリアル化しようとしています。ここで私がサーバーから取得したJSON応答を示します。Jackson JSON配列値逆シリアル化
{
"id":"8938209912"
"version":"1.1"
"cars":{
"mercedes":[
{
"property":"color"
},
{
"property":"price"
},
{
"property":"location"
}
],
"tesla":[
{
"property":"environment"
}
]
}
}
は、クエリに基づいて、cars
は、上記1つ以上のモデルが戻ってきたことがあります。私はこれらのクラスが作成/削除されるたびに、各モデルごとにクラスを作成することはできません。自動車の各モデル(たとえば、tesla
)には、1つ以上のproperty
のキーと値のペアが存在することがあります。
私はJackson
を初めて利用しています。私はいくつかの例を見ており、カスタムのように見える@JsonDeserialize
が行く最善の方法です。だから、私はこのようにRoot
クラスとCars
クラスを作成しました:
// In file Root.java
public class Root {
@JsonProperty("id")
private String id = null;
@JsonProperty("version")
private String version = null;
@JsonProperty("cars")
private Cars cars = null;
}
// In file Cars.java
public class Cars {
public Cars(){}
@JsonDeserialize(using = CarDeserializer.class)
private Map<String, List<Property>> properties;
public Map<String, List<Property>> getProperties() {
return properties;
}
public void setProperties(Map<String, List<Property>> properties) {
this.properties = properties;
}
}
// Property.java
public class Property {
@JsonProperty("property")
private String property;
}
マイデシリアライザは以下の通りです。しかし、空のコンストラクタが呼び出されても、parseメソッド自体はまったく呼び出されません!
// CarDeserializer.class
public class RelationshipDeserializer extends StdDeserializer<Map<String, List<Action>>>{
protected RelationshipDeserializer(){
super(Class.class);
}
@Override
public Map<String, List<Action>> deserialize(JsonParser parser, DeserializationContext ctx)
throws IOException, JsonProcessingException
{
// This method never gets invoked.
}
}
私の質問:
- は、これが最初の場所で適切なアプローチですか?
- なぜ実行が
deserialize()
に届かないと思いますか? (私がチェックし、cars
オブジェクトはJSONに存在している。
は?
残念ながら、私はサーバーから入って来るJSONを制御しません。 – Rettel