Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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 防止Gson在反序列化空字符串时返回null_Java_Json_Gson - Fatal编程技术网

Java 防止Gson在反序列化空字符串时返回null

Java 防止Gson在反序列化空字符串时返回null,java,json,gson,Java,Json,Gson,我正在使用Gson对JSON进行序列化和反序列化。在测试中,我发现当我向Gson对象传递一个空字符串时,它返回null,而不是抛出JsonParseException 如何配置Gson,使其对空字符串抛出错误 这是我的反序列化程序: public final class ProjectDeserializer implements JsonDeserializer<Project> { @Override public Project deserialize(fi

我正在使用Gson对JSON进行序列化和反序列化。在测试中,我发现当我向
Gson
对象传递一个空字符串时,它返回
null
,而不是抛出
JsonParseException

如何配置Gson,使其对空字符串抛出错误


这是我的反序列化程序:

public final class ProjectDeserializer implements JsonDeserializer<Project> {

    @Override
    public Project deserialize(final JsonElement jsonElement, final Type type, final JsonDeserializationContext context) throws JsonParseException {

        final JsonObject jsonObject = jsonElement.getAsJsonObject();

        final Identifier name = context.deserialize(jsonObject.get("name"), Identifier.class);

        Optional<String> license;
        if (jsonObject.has("license")) {
            license = Optional.of(jsonObject.get("license").getAsString());
        } else {
            license = Optional.empty();
        }

        DependencyGroup dependencies;
        if (jsonObject.has("dependencies")) {
            dependencies = context.deserialize(jsonObject.get("dependencies"), DependencyGroup.class);
        } else {
            dependencies = DependencyGroup.of();
        }

        return Project.of(name, license, dependencies);
    }
}

你不能让它像开箱一样。当前
com.google.gson.gson
具有以下代码保护代码:

public T fromJson(JsonReader阅读器,键入typeOfT)抛出JsonIOException、JsonSyntaxException{
布尔值isEmpty=true;
...
试一试{
reader.peek();
...
}捕获(EOFEException e){
/*
*为了与JSON 1.5及更早版本兼容,我们为空返回null
*文件,而不是扔。
*/
如果(我是空的){
返回null;
}
抛出新的JsonSyntaxException(e);
将空字符串或空白字符串传递给该方法会使
reader.peek();
行抛出一个
EOFException
,此时
isEmpty
标志被设置为
true
。这就是为什么反序列化程序对它没有任何影响:它甚至没有被调用。此行为是在commit
25c6ae177b1ca56db7f3c29eb574bdd032a06165中引入的,其中包含以下提交消息摘录:

为了向后兼容,请为空字符串返回null

您可以做的是确保检查反序列化对象的
null
,或者(如果可以进行集中反序列化[至少应该如此]),确保
Gson.fromJson(JsonReader,Type)
用于反序列化目的:在这里,您可以将自定义的
JsonReader
包装
EOFEException
s注入当前未在该方法中捕获的
JsonSyntaxException
s(至少从Gson 2.8.0开始)。例如:

公共类EmptyStringFailFastJsonReader
扩展JsonReader{
public EmptyStringFailFastJsonReader(中的最终读取器){
超级(in),;
}
@凌驾
公共JsonToken peek()
抛出IOException{
试一试{
返回super.peek();
}捕获(最终EOFEException ex){
抛出新的JsonSyntaxException(ex);
}
}
}
这将破坏Gson中的保护代码。下面是一些示例。不会失败的代码:

gson.fromJson(“,fooType);
fromJson(新的StringReader(“”,fooType);
但下面的一个是:

gson.fromJson(新的EmptyStringFailFastJsonReader(新的StringReader(“”),fooType);
出现以下异常消息:

com.google.gson.JsonSyntaxException:java.io.eofeException:第1行第1列路径的输入结束$


谢谢你的详细回答。我认为对于我的项目来说,最好的解决方案是为我可能反序列化的每种类型使用静态方法,并在那里进行检查。
public static Gson gson() {

    final GsonBuilder gsonBuilder = new GsonBuilder();

    // etc...

    gsonBuilder.registerTypeAdapter(Project.class, new ProjectSerializer());
    gsonBuilder.registerTypeAdapter(Project.class, new ProjectDeserializer());

    // etc...

    return gsonBuilder.create();
}