diff --git a/pack-schema/api/src/main/java/org/geysermc/pack/bedrock/resource/BedrockResourcePack.java b/pack-schema/api/src/main/java/org/geysermc/pack/bedrock/resource/BedrockResourcePack.java index 3d6dfe4..b92f61e 100644 --- a/pack-schema/api/src/main/java/org/geysermc/pack/bedrock/resource/BedrockResourcePack.java +++ b/pack-schema/api/src/main/java/org/geysermc/pack/bedrock/resource/BedrockResourcePack.java @@ -37,6 +37,7 @@ import org.geysermc.pack.bedrock.resource.textures.TerrainTexture; import org.geysermc.pack.bedrock.resource.textures.itemtexture.TextureData; import org.geysermc.pack.bedrock.resource.textures.terraintexture.texturedata.Textures; import org.geysermc.pack.util.gson.EmptyArrayAdapterFactory; +import org.geysermc.pack.util.gson.EmptyMapAdapterFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,6 +57,7 @@ public class BedrockResourcePack { .disableHtmlEscaping() .setPrettyPrinting() .registerTypeAdapterFactory(new EmptyArrayAdapterFactory()) + .registerTypeAdapterFactory(new EmptyMapAdapterFactory()) .create(); private final Path directory; diff --git a/pack-schema/api/src/main/java/org/geysermc/pack/util/gson/EmptyArrayAdapterFactory.java b/pack-schema/api/src/main/java/org/geysermc/pack/util/gson/EmptyArrayAdapterFactory.java index 19ec5e3..440a083 100644 --- a/pack-schema/api/src/main/java/org/geysermc/pack/util/gson/EmptyArrayAdapterFactory.java +++ b/pack-schema/api/src/main/java/org/geysermc/pack/util/gson/EmptyArrayAdapterFactory.java @@ -35,14 +35,16 @@ import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class EmptyArrayAdapterFactory implements TypeAdapterFactory { @Override public TypeAdapter create(Gson gson, TypeToken type) { Class rawType = type.getRawType(); - if (!List.class.isAssignableFrom(rawType)) { + if (!Collection.class.isAssignableFrom(rawType)) { return null; } diff --git a/pack-schema/api/src/main/java/org/geysermc/pack/util/gson/EmptyMapAdapterFactory.java b/pack-schema/api/src/main/java/org/geysermc/pack/util/gson/EmptyMapAdapterFactory.java new file mode 100644 index 0000000..6c417bd --- /dev/null +++ b/pack-schema/api/src/main/java/org/geysermc/pack/util/gson/EmptyMapAdapterFactory.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/PackConverter + * + */ + +package org.geysermc.pack.util.gson; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import java.io.IOException; +import java.util.Map; + +public class EmptyMapAdapterFactory implements TypeAdapterFactory { + + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + Class rawType = type.getRawType(); + if (!Map.class.isAssignableFrom(rawType)) { + return null; + } + + TypeAdapter delegate = gson.getDelegateAdapter(this, type); + + return new TypeAdapter() { + + @Override + public T read(JsonReader in) throws IOException { + return delegate.read(in); + } + + @Override + public void write(JsonWriter out, T value) throws IOException { + delegate.write(out, (value == null || value instanceof Map map && map.isEmpty()) ? null : value); + } + }; + } +} \ No newline at end of file