package com.google.gson; import com.google.gson.internal..Gson.Preconditions; import com.google.gson.internal.LazilyParsedNumber; import java.math.BigInteger; public final class JsonPrimitive extends JsonElement { private static final Class<?>[] PRIMITIVE_TYPES = { Integer.TYPE, Long.TYPE, Short.TYPE, Float.TYPE, Double.TYPE, Byte.TYPE, Boolean.TYPE, Character.TYPE, Integer.class, Long.class, Short.class, Float.class, Double.class, Byte.class, Boolean.class, Character.class }; private Object value; public JsonPrimitive(Boolean bool) { setValue(bool); } public JsonPrimitive(Number number) { setValue(number); } public JsonPrimitive(String string) { setValue(string); } void setValue(Object primitive) { if ((primitive instanceof Character)) { char c = ((Character)primitive).charValue(); this.value = String.valueOf(c); } else { .Gson.Preconditions.checkArgument(((primitive instanceof Number)) || (isPrimitiveOrString(primitive))); this.value = primitive; } } public boolean isBoolean() { return this.value instanceof Boolean; } Boolean getAsBooleanWrapper() { return (Boolean)this.value; } public boolean getAsBoolean() { if (isBoolean()) { return getAsBooleanWrapper().booleanValue(); } return Boolean.parseBoolean(getAsString()); } public boolean isNumber() { return this.value instanceof Number; } public Number getAsNumber() { return (this.value instanceof String) ? new LazilyParsedNumber((String)this.value) : (Number)this.value; } public boolean isString() { return this.value instanceof String; } public String getAsString() { if (isNumber()) return getAsNumber().toString(); if (isBoolean()) { return getAsBooleanWrapper().toString(); } return (String)this.value; } public double getAsDouble() { return isNumber() ? getAsNumber().doubleValue() : Double.parseDouble(getAsString()); } public long getAsLong() { return isNumber() ? getAsNumber().longValue() : Long.parseLong(getAsString()); } public int getAsInt() { return isNumber() ? getAsNumber().intValue() : Integer.parseInt(getAsString()); } private static boolean isPrimitiveOrString(Object target) { if ((target instanceof String)) { return true; } Class classOfPrimitive = target.getClass(); for (Class standardPrimitive : PRIMITIVE_TYPES) { if (standardPrimitive.isAssignableFrom(classOfPrimitive)) { return true; } } return false; } public int hashCode() { if (this.value == null) { return 31; } if (isIntegral(this)) { long value = getAsNumber().longValue(); return (int)(value ^ value >>> 32); } if ((this.value instanceof Number)) { long value = Double.doubleToLongBits(getAsNumber().doubleValue()); return (int)(value ^ value >>> 32); } return this.value.hashCode(); } public boolean equals(Object obj) { if (this == obj) { return true; } if ((obj == null) || (getClass() != obj.getClass())) { return false; } JsonPrimitive other = (JsonPrimitive)obj; if (this.value == null) { return other.value == null; } if ((isIntegral(this)) && (isIntegral(other))) { return getAsNumber().longValue() == other.getAsNumber().longValue(); } if (((this.value instanceof Number)) && ((other.value instanceof Number))) { double a = getAsNumber().doubleValue(); double b = other.getAsNumber().doubleValue(); return (a == b) || ((Double.isNaN(a)) && (Double.isNaN(b))); } return this.value.equals(other.value); } private static boolean isIntegral(JsonPrimitive primitive) { if ((primitive.value instanceof Number)) { Number number = (Number)primitive.value; return ((number instanceof BigInteger)) || ((number instanceof Long)) || ((number instanceof Integer)) || ((number instanceof Short)) || ((number instanceof Byte)); } return false; } }