Я хочу проанализировать объект json, содержащий тип динамического поля, используя Gson:
{
"rows":
[
{
"id": "1",
"interventions": [
{
"type": "type1",
"label": "label 1"
},
{
"type": "type2",
"label": ["label 1","label 2"]
},
{
"type": "type3",
"label": "label 3",
}
]
}
]
}
Как видите, поле «метка» может быть строкой или списком строк.
Я написал настраиваемый десериализатор для решения этой проблемы, он работает, если в поле «вмешательства» есть только один элемент (независимо от того, является ли поле «метка» строкой или списком):
{"rows":
[
{
"id": "1",
"interventions": [
{
"type": "type1",
"label": "label 1"
}
]
}
]
}
Но всегда выдает com.google.gson.JsonArray. Нельзя привести к исключению com.google.gson.JsonPrimitive, если имеется более одного элемента «вмешательства».
Вот настроенный десериализатор:
public class CustomDeserializer implements JsonDeserializer<InterventionsModel> {
@Override
public InterventionsModel deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
if(je != null && je.getAsJsonObject()!=null) {
JsonPrimitive jp = je.getAsJsonObject().getAsJsonPrimitive("label");
if (jp != null && jp.isString()) {
String label = jp.getAsString();
List<String> list = new ArrayList<String>(1);
list.add(label);
InterventionsModel interventionsModel = new InterventionsModel();
interventionsModel.setLabel(list);
return interventionsModel;
}
}
return new Gson().fromJson(je, InterventionsModel.class);
}
}
В методе вызова:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(InterventionsModel.class, new CustomDeserializer());
builder.setPrettyPrinting();
Gson gson = builder.create();
Классы для объектов:
public class ResultsModel {
private List<RowModel> rows;
//getter and setter ..
}
public class RowModel {
private String id;
private List<InterventionsModel> interventions;
//getter and setter
}
public class InterventionsModel {
private String type;
private List<String> label;
//setter and getter
}
Может кто-нибудь помочь, пожалуйста?