2017-08-11 66 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

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