Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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反序列化忽略列表中的空对象_Java_Android_Json_Serialization_Gson - Fatal编程技术网

Java GSON反序列化忽略列表中的空对象

Java GSON反序列化忽略列表中的空对象,java,android,json,serialization,gson,Java,Android,Json,Serialization,Gson,一个客户端决定开始在数组末尾发送空的JSON对象(以帮助缓存facepalm),但这在我的应用程序中导致了一系列意外行为 例如,这是我正在发送的数据 [{object}, {object}, {}, {object}] 我目前使用GSON对从服务器发送的数据进行反序列化。我一直在研究类型适配器以过滤掉这些空对象,但是我不完全确定如何实现过滤。关于如何使用GSON跳过空对象的任何想法?您可以从 我解决了这个问题。。。我必须创建一个TypeAdapterFactory,将空对象设置为null,然后

一个客户端决定开始在数组末尾发送空的
JSON
对象(以帮助缓存
facepalm
),但这在我的应用程序中导致了一系列意外行为

例如,这是我正在发送的数据

[{object}, {object}, {}, {object}]

我目前使用
GSON
对从服务器发送的数据进行反序列化。我一直在研究类型适配器以过滤掉这些空对象,但是我不完全确定如何实现过滤。关于如何使用GSON跳过空对象的任何想法?

您可以从


我解决了这个问题。。。我必须创建一个
TypeAdapterFactory
,将空对象设置为
null
,然后从结果列表中过滤掉空对象

这是我的
TypeAdapterFactory

private static class EmptyCheckTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {

        // We filter out the EmptyCheckTypeAdapter as we need to check this for emptiness!
        if (Story.class.isAssignableFrom(type.getRawType())) {
            final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
            final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
            return new EmptyCheckTypeAdapter<>(delegate, elementAdapter).nullSafe();
        }
        return null;
    }

    public class EmptyCheckTypeAdapter<T> extends TypeAdapter<T> {

        private final TypeAdapter<T> delegate;
        private final TypeAdapter<JsonElement> elementAdapter;

        public EmptyCheckTypeAdapter(final TypeAdapter<T> delegate,
                                     final TypeAdapter<JsonElement> elementAdapter) {
            this.delegate = delegate;
            this.elementAdapter = elementAdapter;
        }

        @Override
        public void write(final JsonWriter out, final T value) throws IOException {
            this.delegate.write(out, value);
        }

        @Override
        public T read(final JsonReader in) throws IOException {
            final JsonObject asJsonObject = elementAdapter.read(in).getAsJsonObject();
            if (asJsonObject.entrySet().isEmpty()) {
                return null;
            }
            return this.delegate.fromJsonTree(asJsonObject);
        }
    }
}

我不需要序列化数据。。。我可以对反序列化执行类似的操作吗?是的,这根本不是反序列化。您在实际的反序列化中是否遇到问题,或者在解析完成并创建对象后是否遇到问题?解析是正确的。。。我只是想知道是否有一种方法可以轻松忽略空对象…你能简单地迭代生成的对象项并删除那些缺少数据的项吗?是的,这就是我最终要做的。。。有点希望通过反序列化过程完成,但只是在反序列化后完成。在事实发生后过滤列表不是最佳选择,是否可以告诉GSON首先不要将null元素添加到列表中?
Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(Collection.class, new CollectionAdapter()).create();
private static class EmptyCheckTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {

        // We filter out the EmptyCheckTypeAdapter as we need to check this for emptiness!
        if (Story.class.isAssignableFrom(type.getRawType())) {
            final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
            final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
            return new EmptyCheckTypeAdapter<>(delegate, elementAdapter).nullSafe();
        }
        return null;
    }

    public class EmptyCheckTypeAdapter<T> extends TypeAdapter<T> {

        private final TypeAdapter<T> delegate;
        private final TypeAdapter<JsonElement> elementAdapter;

        public EmptyCheckTypeAdapter(final TypeAdapter<T> delegate,
                                     final TypeAdapter<JsonElement> elementAdapter) {
            this.delegate = delegate;
            this.elementAdapter = elementAdapter;
        }

        @Override
        public void write(final JsonWriter out, final T value) throws IOException {
            this.delegate.write(out, value);
        }

        @Override
        public T read(final JsonReader in) throws IOException {
            final JsonObject asJsonObject = elementAdapter.read(in).getAsJsonObject();
            if (asJsonObject.entrySet().isEmpty()) {
                return null;
            }
            return this.delegate.fromJsonTree(asJsonObject);
        }
    }
}
myDto.stories.removeAll(Collections.singleton(null));