package cn.citycraft.GsonAgent.nms; import java.lang.reflect.Field; import java.util.AbstractMap; import java.util.Map; import java.util.Set; import cn.citycraft.GsonAgent.api.JsonObject; import cn.citycraft.GsonAgent.api.utils.Utils; import net.minecraft.util.com.google.gson.internal.LinkedTreeMap; /** * * @since 2016年1月5日 下午1:49:41 * @author 喵♂呜 */ public class JsonObjectHandle extends JsonElementHandle implements JsonObject { private static Field membersField; static { try { membersField = net.minecraft.util.com.google.gson.JsonObject.class.getDeclaredField("members"); membersField.setAccessible(true); } catch (final Exception e) { e.printStackTrace(); } } private final net.minecraft.util.com.google.gson.JsonObject handle; private AbstractMap members; public JsonObjectHandle() { this(new net.minecraft.util.com.google.gson.JsonObject()); } @SuppressWarnings("unchecked") protected JsonObjectHandle(final net.minecraft.util.com.google.gson.JsonObject handle) { this.handle = handle; try { members = (AbstractMap) membersField.get(this.handle); } catch (final Exception e) { e.printStackTrace(); } } @Override public void add(final String property, final cn.citycraft.GsonAgent.api.JsonElement value) { handle.add(property, ((JsonElementHandle) value).getHandle()); } @Override public void addProperty(final String property, final Boolean value) { handle.addProperty(property, value); } @Override public void addProperty(final String property, final Character value) { handle.addProperty(property, value); } @Override public void addProperty(final String property, final Number value) { handle.addProperty(property, value); } @Override public void addProperty(final String property, final String value) { handle.addProperty(property, value); } @Override public cn.citycraft.GsonAgent.api.JsonObject deepCopy() { return new JsonObjectHandle(Utils.deepCopyObject(this.handle)); } @Override public Set> entrySet() { try { final Map result = new LinkedTreeMap<>(); for (final Map.Entry entry : members.entrySet()) { result.put(entry.getKey(), new JsonElementHandle(entry.getValue())); } return result.entrySet(); } catch (final Exception e) { e.printStackTrace(); } return null; } @Override public boolean equals(final Object o) { return handle.equals(o); } @Override public JsonElementHandle get(final String memberName) { return new JsonElementHandle(handle.get(memberName)); } @Override public JsonArrayHandle getAsJsonArray(final String memberName) { return new JsonArrayHandle(handle.getAsJsonArray(memberName)); } @Override public JsonObjectHandle getAsJsonObject(final String memberName) { return new JsonObjectHandle(handle.getAsJsonObject(memberName)); } @Override public JsonPrimitiveHandle getAsJsonPrimitive(final String memberName) { return new JsonPrimitiveHandle(handle.getAsJsonPrimitive(memberName)); } @Override public boolean has(final String memberName) { return handle.has(memberName); } @Override public int hashCode() { return handle.hashCode(); } @Override public JsonElementHandle remove(final String property) { return new JsonElementHandle(handle.remove(property)); } }