2017-08-11 6 views
1
{ 
    "response": { 
    "data": { 
     "333": [ 
     { 
      "id": "69238", 
      "code": "545" 
     }, 
     { 
      "id": "69239", 
      "code": "545", 
      "marked": "123" 
     } 
     ], 
     "544": [ 
     { 
      "id": "69906", 
      "code": "544", 
      "marked": "123" 
     }, 
     { 
      "id": "69907", 
      "code": "544" 
     } 
     ], 
     "890": [ 
     { 
      "id": "69238", 
      "code": "545", 
      "marked": "123" 
     }, 
     { 
      "id": "69239", 
      "code": "545" 
     } 
     ] 
    } 
    } 
} 

私はこのJSONデータをレスポンスとして取得し、マッピングしようとしています。残念ながら私はできません。Javaオブジェクトの型(GsonまたはJacksonなど)の配列を持つJson Parse Json

最初の理由はオブジェクトのインデックスが変更可能です。たとえば、1つの索引890と他の1つは544です。

第2の理由は、オブジェクト内の項目数が異なることです。

私はwww.jsonschema2pojo.orgでJavaクラスを作成しようとします。アンダースコア+整数のクラスがたくさんあります。例えば;

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 
import org.apache.commons.lang.builder.EqualsBuilder; 
import org.apache.commons.lang.builder.HashCodeBuilder; 
import org.apache.commons.lang.builder.ToStringBuilder; 

public class _544 { 

    @SerializedName("id") 
    @Expose 
    private String id; 
    @SerializedName("code") 
    @Expose 
    private String code; 
    @SerializedName("marked") 
    @Expose 
    private String marked; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public String getMarked() { 
     return marked; 
    } 

    public void setMarked(String marked) { 
     this.marked = marked; 
    } 

    @Override 
    public String toString() { 
     return ToStringBuilder.reflectionToString(this); 
    } 

    @Override 
    public int hashCode() { 
     return new HashCodeBuilder().append(id).append(code).append(marked).toHashCode(); 
    } 

    @Override 
    public boolean equals(Object other) { 
     if (other == this) { 
      return true; 
     } 
     if ((other instanceof _544) == false) { 
      return false; 
     } 
     _544 rhs = ((_544) other); 
     return new EqualsBuilder().append(id, rhs.id).append(code, rhs.code).append(marked, rhs.marked).isEquals(); 
    } 

}  

、もう一つは、この

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 
import org.apache.commons.lang.builder.EqualsBuilder; 
import org.apache.commons.lang.builder.HashCodeBuilder; 
import org.apache.commons.lang.builder.ToStringBuilder; 

public class _890 { 

    @SerializedName("id") 
    @Expose 
    private String id; 
    @SerializedName("code") 
    @Expose 
    private String code; 
    @SerializedName("marked") 
    @Expose 
    private String marked; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public String getMarked() { 
     return marked; 
    } 

    public void setMarked(String marked) { 
     this.marked = marked; 
    } 

    @Override 
    public String toString() { 
     return ToStringBuilder.reflectionToString(this); 
    } 

    @Override 
    public int hashCode() { 
     return new HashCodeBuilder().append(id).append(code).append(marked).toHashCode(); 
    } 

    @Override 
    public boolean equals(Object other) { 
     if (other == this) { 
      return true; 
     } 
     if ((other instanceof _890) == false) { 
      return false; 
     } 
     _890 rhs = ((_890) other); 
     return new EqualsBuilder().append(id, rhs.id).append(code, rhs.code).append(marked, rhs.marked).isEquals(); 
    } 

} 

のようなものである等の番号544または890は、どのように私は、Javaでこのダイナミックなインデックス付きデータとのマッピングを行うことができますダイナミック

ですか?

ありがとうございました。

答えて

0

カスタムデシリアライザを使用できます。以下の例はGsonを使っていますが、Jacksonと同じことができます。

は、応答のための
String json = "..."; 

Gson gson = new GsonBuilder().registerTypeAdapter(Response.class, new CustomDeserializer()).create(); 

System.out.println(gson.fromJson(json, Response.class)); 

クラス:各データオブジェクトのための

class Response { 
    private Map<String, List<Data>> data; 

    public Response(Map<String, List<Data>> data) { 
     this.data = data; 
    } 
} 

クラス:

class Data { 
    private String id; 
    private String code; 
    private String mark; 
} 

応答がここにありますメインクラスで

class CustomDeserializer implements JsonDeserializer<Response> { 

    @Override 
    public Response deserialize(JsonElement jsonElement, Type typeOfElement, JsonDeserializationContext context) throws JsonParseException { 
     JsonObject data = jsonElement.getAsJsonObject().get("response").getAsJsonObject().get("data").getAsJsonObject(); 
     Type listType = new TypeToken<List<Data>>() {}.getType(); 
     Map<String, List<Data>> dataMap = new HashMap<String, List<Data>>(); 

     for (Map.Entry<String, JsonElement> entry : data.entrySet()) { 
      List<Data> dataList = context.deserialize(entry.getValue(), listType); 

      dataMap.put(entry.getKey(), dataList); 
     } 

     return new Response(dataMap); 
    } 
} 

各データエントリのマップとリストその値の(例:333 - > Dataオブジェクトのリスト)、デシリアライザを変更してキー(333)をDataオブジェクトの変数の1つにしてforループに代入することができます。

+1

ありがとうございました。それは仕事です。 –

関連する問題