2017-08-11 110 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解析Json與陣列具有不同的對象類型(Gson或Jackson等)

第一個原因是對象的索引是可變的。例如,一個索引890和另一個索引是544.

第二個原因是對象中項目的數量不同。

當我嘗試使用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可以做同樣的事情。

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); 
    } 
} 

在主類:

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

響應這裏將有一個每個數據條目的映射和一個列表的價值。 (例如:333 - >數據對象列表),但是您可以更改解串器以將鍵(333)作爲Data對象的其中一個變量並將其分配給for循環。

+1

謝謝你的回答。是工作。 –