是否有可能 gson 将 JsonArray 自动映射到 POJO
Is it possible to gson auto-map a JsonArray into a POJO
我有一个包含 4 个字段的 pojo 需要填写。这些值来自对象的 JsonArray(嵌套在更大的 JSON 对象中),其中包含许多元素,例如 -
"res":[
{"id":"irrelevant","val":"0"},
{"id":"irrelevant","val":"N"},
{"id":"irrelevant","val":"NO_THEFT"},
{"id":"first_needed_field","val":"0"},
{"id":"irrelevant","val":"N"},
{"id":"second_needed_field","val":"33342"},
etc etc etc
]
是否可以使用 gson.fromJson() 方法自动映射此 JsonArray?
我使用@SerializedName 注释来映射 Pojo 字段以匹配 id,但我一直无法弄清楚如何将数组转换为对象。 None 我的尝试成功了,虽然我在这里发现了许多其他 gson 问题和其他人有同样的错误,但我还没有发现任何人故意尝试我正在尝试的事情。
这有点含糊,但我想我知道你想做什么。提示是不要这样做。
请使用 Gson 库提供的序列化和反序列化。但只需遍历 List<> 并以常规方式填充对象。
是的,这是可能的,但是您将解释引入反射。正如您已经提到的,您正在映射一个更大的对象,我已经可以想象它产生的混乱代码。
您可以使用自定义 TypeAdapter
。
假设您有以下 Pojo:
public class YourPojoClass {
private String firstNeededField;
private String secondNeededField;
// Getters and setters...
}
你应该在父 class:
中像这样声明字段 res
public class YourParentClass {
private YourPojoClass res;
// Getters and setters...
}
然后你必须像这样实现你的自定义TypeAdapter
:
public class YourCustomTypeAdapter extends TypeAdapter<YourPojoClass> {
@Override
public YourPojoClass read(JsonReader in) throws IOException {
YourPojoClass result = new YourPojoClass();
Gson gson = new Gson();
in.beginArray();
while(in.hasNext()) {
IdAndVal entry = gson.fromJson(in, IdAndVal.class);
if (entry.getId() != null) {
switch (entry.getId()) {
case "first_needed_field":
result.setFirstNeededField(entry.getVal());
break;
case "second_needed_field":
result.setSecondNeededField(entry.getVal());
break;
default:
break;
}
}
}
in.endArray();
return result;
}
@Override
public void write(JsonWriter out, YourPojoClass value) throws IOException {
throw new UnsupportedOperationException("Not implemented");
}
private static class IdAndVal {
private String id;
private String val;
public String getId() { return this.id; }
public void setId(String id) { this.id = id; }
public String getVal() { return this.val; }
public void setVal(String val) { this.val = val; }
}
}
您现在要做的就是使用 GsonBuilder
注册此 TypeAdapter
以使用它:
Gson gson = new GsonBuilder()
.registerTypeAdapter(YourPojoClass.class, new YourCustomTypeAdapter())
.create();
你应该可以开始了。
我有一个包含 4 个字段的 pojo 需要填写。这些值来自对象的 JsonArray(嵌套在更大的 JSON 对象中),其中包含许多元素,例如 -
"res":[
{"id":"irrelevant","val":"0"},
{"id":"irrelevant","val":"N"},
{"id":"irrelevant","val":"NO_THEFT"},
{"id":"first_needed_field","val":"0"},
{"id":"irrelevant","val":"N"},
{"id":"second_needed_field","val":"33342"},
etc etc etc
]
是否可以使用 gson.fromJson() 方法自动映射此 JsonArray?
我使用@SerializedName 注释来映射 Pojo 字段以匹配 id,但我一直无法弄清楚如何将数组转换为对象。 None 我的尝试成功了,虽然我在这里发现了许多其他 gson 问题和其他人有同样的错误,但我还没有发现任何人故意尝试我正在尝试的事情。
这有点含糊,但我想我知道你想做什么。提示是不要这样做。
请使用 Gson 库提供的序列化和反序列化。但只需遍历 List<> 并以常规方式填充对象。
是的,这是可能的,但是您将解释引入反射。正如您已经提到的,您正在映射一个更大的对象,我已经可以想象它产生的混乱代码。
您可以使用自定义 TypeAdapter
。
假设您有以下 Pojo:
public class YourPojoClass {
private String firstNeededField;
private String secondNeededField;
// Getters and setters...
}
你应该在父 class:
中像这样声明字段res
public class YourParentClass {
private YourPojoClass res;
// Getters and setters...
}
然后你必须像这样实现你的自定义TypeAdapter
:
public class YourCustomTypeAdapter extends TypeAdapter<YourPojoClass> {
@Override
public YourPojoClass read(JsonReader in) throws IOException {
YourPojoClass result = new YourPojoClass();
Gson gson = new Gson();
in.beginArray();
while(in.hasNext()) {
IdAndVal entry = gson.fromJson(in, IdAndVal.class);
if (entry.getId() != null) {
switch (entry.getId()) {
case "first_needed_field":
result.setFirstNeededField(entry.getVal());
break;
case "second_needed_field":
result.setSecondNeededField(entry.getVal());
break;
default:
break;
}
}
}
in.endArray();
return result;
}
@Override
public void write(JsonWriter out, YourPojoClass value) throws IOException {
throw new UnsupportedOperationException("Not implemented");
}
private static class IdAndVal {
private String id;
private String val;
public String getId() { return this.id; }
public void setId(String id) { this.id = id; }
public String getVal() { return this.val; }
public void setVal(String val) { this.val = val; }
}
}
您现在要做的就是使用 GsonBuilder
注册此 TypeAdapter
以使用它:
Gson gson = new GsonBuilder()
.registerTypeAdapter(YourPojoClass.class, new YourCustomTypeAdapter())
.create();
你应该可以开始了。