2017-03-10 22 views
0

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. 
     } 
    } 

私の質問:

  1. は、これが最初の場所で適切なアプローチですか?
  2. なぜ実行がdeserialize()に届かないと思いますか? (私がチェックし、carsオブジェクトはJSONに存在している。
  3. は?

答えて

0

Jacksonを使用して、このJSONを解析するためのより良いアプローチがあることが、そのJSONには何も一致しないため、「プロパティ」は、デシリアライザが呼び出されることはありません。 JSONのフィールド名は「プロパティ」で、Map<String, List<Property>>と一致しません。より近いと思われますList<Property>

次のJSONを制御しますか?車の名前/タイプはオブジェクトの名前ではなく、それ自身のフィールドに入力します。次に、汎用オブジェクトを使用することができます。彼らは新しい名前/タイプを追加し、あなたはそれに合ったオブジェクトを持っていません。

+0

残念ながら、私はサーバーから入って来るJSONを制御しません。 – Rettel

関連する問題