Java使用具有不同对象类型(Gson或Jackson等)的数组解析Json
我将此Java使用具有不同对象类型(Gson或Jackson等)的数组解析Json,java,android,json,jackson,gson,Java,Android,Json,Jackson,Gson,我将此JSON数据作为响应,并尝试映射。不幸的是我不能 第一个原因是对象的索引是可变的。例如,一个索引是890,另一个是544 第二个原因是对象中的项目数不同 当我尝试使用创建java类时。我得到了很多带有下划线+整数的类。比如, { "response": { "data": { "333": [ { "id": "69238", "code": "545" },
JSON
数据作为响应,并尝试映射。不幸的是我不能
第一个原因是对象的索引是可变的。例如,一个索引是890,另一个是544
第二个原因是对象中的项目数不同
当我尝试使用创建java类时。我得到了很多带有下划线+整数的类。比如,
{
"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"
}
]
}
}
}
另一个是这样的
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();
}
}
544或890等数字是动态的
那么,我如何用Java实现这个动态索引数据的映射呢
谢谢您的帮助。您可以使用自定义反序列化程序。下面的例子使用的是Gson,但同样的事情也可以用Jackson来完成
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();
}
}
响应的类:
String json = "...";
Gson gson = new GsonBuilder().registerTypeAdapter(Response.class, new CustomDeserializer()).create();
System.out.println(gson.fromJson(json, Response.class));
这里的响应将具有每个数据条目的映射及其值列表。(例如:333->数据对象列表),但您可以更改反序列化程序,使键(333)成为数据对象的变量之一,并在for循环中分配它
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;
}