package chbachman.armour.util.json; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import net.minecraft.item.ItemStack; import chbachman.api.upgrade.IUpgrade; import chbachman.api.upgrade.Recipe; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; public class CustomRecipeJson implements JsonDeserializer<Recipe>, JsonSerializer<Recipe> { @Override public JsonElement serialize(Recipe src, Type typeOfSrc, JsonSerializationContext context) { JsonObject json = new JsonObject(); json.add("output", context.serialize(src.getRecipeOutput(), IUpgrade.class)); if (src.modid != null) { json.addProperty("modid", src.modid); } json.addProperty("width", src.width); json.addProperty("height", src.height); for (int i = 0; i < 3; i++) { JsonArray array = new JsonArray(); for (int x = 0; x < 3; x++) { Object toSerialize = src.getInput()[i * 3 + x]; if (toSerialize instanceof String) { array.add(new JsonPrimitive((String) toSerialize)); } else if (toSerialize instanceof ItemStack) { array.add(context.serialize((ItemStack) toSerialize, ItemStack.class)); } if (toSerialize == null) { array.add(JsonNull.INSTANCE); } } json.add("row" + (i + 1), array); } return json; } @Override public Recipe deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject json = element.getAsJsonObject(); IUpgrade output = context.deserialize(json.get("output"), IUpgrade.class); List<Object> list = new ArrayList<Object>(); JsonArray array = new JsonArray(); array.addAll(json.get("row1").getAsJsonArray()); array.addAll(json.get("row2").getAsJsonArray()); array.addAll(json.get("row3").getAsJsonArray()); for (JsonElement e : array) { if (e.isJsonNull()) { list.add(null); continue; } if (!e.isJsonObject()) { list.add(e.getAsString()); continue; } list.add((ItemStack) context.deserialize(e, ItemStack.class)); } Recipe recipe = new Recipe(output, list.toArray(), json.get("width").getAsInt(), json.get("height").getAsInt()); recipe.width = json.get("width").getAsInt(); recipe.height = json.get("height").getAsInt(); if (json.has("modid")) { recipe.setModid(json.get("modid").getAsString()); } return recipe; } }