Два разных типа ответов в POJO - PullRequest
0 голосов
/ 02 мая 2019

Я использую Retrofit с POJO, что обычно работает, но ответ имеет два разных объекта в зависимости от того, верен ли результат. Какой из них String, а другой - Object:

{
  "data":"No results."  
}

или

{
  "data": {
    "exame": [
      {
        "id": 776,
        "codigo": "DHT",
        "instrucao": "- Text."
      },
      {
        "id": 776,
        "codigo": "DHT",
        "instrucao": "- Text"
      }
    ]
  }
}

И мой класс:

public class Exame {

    @SerializedName("data")
    @Expose
    @Nullable
    private ExameItem exameItem;
    private String mensagem;

    public ExameItem getExameItem() {
        return exameItem;
    }

    public void setExameItem(ExameItem exameItem) {
        this.exameItem = exameItem;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }
}

Когда я делаю Exame().getExameItem, это нормально, но когда я пытаюсь проверить, есть ли сообщение в Exame().getMessagem, это выдает мне эту ошибку:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 10 path $.data

Итак, я думаю, как я могу проверить, является ли @data String из Object, но я не знаю, как, кто-нибудь может помочь?

1 Ответ

0 голосов
/ 02 мая 2019

Вам необходимо внедрить пользовательский десериализатор с помощью интерфейса JsonDeserializer.См. Пример ниже:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.JsonAdapter;

import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.List;

public class GsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        Gson gson = new GsonBuilder().create();

        System.out.println(gson.fromJson(new FileReader(jsonFile), Exame.class));
    }
}

class ExamsJsonDeserializer implements JsonDeserializer<Exame> {

    @Override
    public Exame deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject root = json.getAsJsonObject();
        JsonElement data = root.get("data");

        Exame exam = new Exame();
        if (data.isJsonPrimitive()) {
            exam.setMensagem(data.getAsString());
        } else {
            ExameItem examItem = context.deserialize(data, ExameItem.class);
            exam.setExameItem(examItem);
        }
        return exam;
    }
}

@JsonAdapter(ExamsJsonDeserializer.class)
class Exame {

    private ExameItem exameItem;
    private String mensagem;

    // getters, setters, toString
}

class ExameItem {

    private List<Item> exame;

    //getters, setters, toString
}

class Item {

    private int id;
    // ...
    //getters, setters, toString
}
...