Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java POJO中两种不同类型的响应_Java_Json_Gson_Pojo_Json Deserialization - Fatal编程技术网

Java POJO中两种不同类型的响应

Java POJO中两种不同类型的响应,java,json,gson,pojo,json-deserialization,Java,Json,Gson,Pojo,Json Deserialization,我正在使用改造和POJO,这通常是有效的,但是根据结果是否有效,答案有两个不同的对象。哪一个是字符串,另一个是对象: { "data":"No results." } 或: 我的班级: public class Exame { @SerializedName("data") @Expose @Nullable private ExameItem exameItem; private String mensagem; public Ex

我正在使用
改造
POJO
,这通常是有效的,但是根据结果是否有效,答案有两个不同的对象。哪一个是
字符串
,另一个是
对象

{
  "data":"No results."  
}
或:

我的班级:

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().getexamitem
时,它很好,但当我尝试测试
Exame()中是否有消息。getMessagem
它会给我带来以下错误:

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

所以,我想我该如何测试@data是否是
对象的
字符串
,但我不知道该怎么做,任何人都可以帮忙吗

您需要通过实现
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
}
import com.google.gson.gson;
导入com.google.gson.GsonBuilder;
导入com.google.gson.JsonDeserializationContext;
导入com.google.gson.JsonDeserializer;
导入com.google.gson.JsonElement;
导入com.google.gson.JsonObject;
导入com.google.gson.JsonParseException;
导入com.google.gson.annotations.JsonAdapter;
导入java.io.File;
导入java.io.FileReader;
导入java.lang.reflect.Type;
导入java.util.List;
公共类GsonApp{
公共静态void main(字符串[]args)引发异常{
File jsonFile=新文件(“./resource/test.json”).getAbsoluteFile();
Gson Gson=new GsonBuilder().create();
System.out.println(gson.fromJson(新文件读取器(jsonFile),Exame.class));
}
}
类ExamsJsonDeserializer实现JsonDeserializer{
@凌驾
public Exame反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
JsonObject root=json.getAsJsonObject();
JsonElement data=root.get(“数据”);
Exame考试=新Exame();
if(data.isJsonPrimitive()){
setmensage(data.getAsString());
}否则{
ExameItem examItem=context.deserialize(数据,ExameItem.class);
考试。设置考试项目(examItem);
}
复试;
}
}
@JsonAdapter(ExamsJsonDeserializer.class)
课堂考试{
私人考试;
私人字符串管理;
//接球手、二传手、投球手
}
课堂考试{
私人清单考试;
//接球手、二传手、投球手
}
类项目{
私有int-id;
// ...
//接球手、二传手、投球手
}
查看此项
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
}