More lenient parsing of Numbers and Booleans. Basically, can deserialize properly formatted stringr representations of numbers and booleans.
diff --git a/gson/src/main/java/com/google/gson/JsonPrimitive.java b/gson/src/main/java/com/google/gson/JsonPrimitive.java
index d696bc3..029ab5b 100644
--- a/gson/src/main/java/com/google/gson/JsonPrimitive.java
+++ b/gson/src/main/java/com/google/gson/JsonPrimitive.java
@@ -128,7 +128,11 @@
*/
@Override
public boolean getAsBoolean() {
- return ((Boolean) value).booleanValue();
+ if (isBoolean()) {
+ return getAsBooleanWrapper().booleanValue();
+ } else {
+ return Boolean.parseBoolean(getAsString());
+ }
}
/**
@@ -179,7 +183,11 @@
*/
@Override
public double getAsDouble() {
- return ((Number) value).doubleValue();
+ if (isNumber()) {
+ return getAsNumber().doubleValue();
+ } else {
+ return Double.parseDouble(getAsString());
+ }
}
/**
@@ -220,7 +228,11 @@
*/
@Override
public float getAsFloat() {
- return ((Number) value).floatValue();
+ if (isNumber()) {
+ return getAsNumber().floatValue();
+ } else {
+ return Float.parseFloat(getAsString());
+ }
}
/**
@@ -231,7 +243,11 @@
*/
@Override
public long getAsLong() {
- return ((Number) value).longValue();
+ if (isNumber()) {
+ return getAsNumber().longValue();
+ } else {
+ return Long.parseLong(getAsString());
+ }
}
/**
@@ -240,9 +256,13 @@
* @return get this element as a primitive short.
* @throws ClassCastException if the value contained is not a valid short value.
*/
- @Override
+ @Override
public short getAsShort() {
- return ((Number) value).shortValue();
+ if (isNumber()) {
+ return getAsNumber().shortValue();
+ } else {
+ return Short.parseShort(getAsString());
+ }
}
/**
@@ -253,12 +273,20 @@
*/
@Override
public int getAsInt() {
- return ((Number) value).intValue();
+ if (isNumber()) {
+ return getAsNumber().intValue();
+ } else {
+ return Integer.parseInt(getAsString());
+ }
}
@Override
public byte getAsByte() {
- return ((Number) value).byteValue();
+ if (isNumber()) {
+ return getAsNumber().byteValue();
+ } else {
+ return Byte.parseByte(getAsString());
+ }
}
@Override
diff --git a/gson/src/test/java/com/google/gson/JsonPrimitiveTest.java b/gson/src/test/java/com/google/gson/JsonPrimitiveTest.java
new file mode 100644
index 0000000..485de41
--- /dev/null
+++ b/gson/src/test/java/com/google/gson/JsonPrimitiveTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.gson;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit test for the {@link JsonPrimitive} class.
+ *
+ * @author Joel Leitch
+ */
+public class JsonPrimitiveTest extends TestCase {
+
+ public void testBoolean() throws Exception {
+ JsonPrimitive json = new JsonPrimitive(Boolean.TRUE);
+
+ assertTrue(json.isBoolean());
+ assertTrue(json.getAsBoolean());
+ }
+
+ public void testParsingStringAsBoolean() throws Exception {
+ JsonPrimitive json = new JsonPrimitive("true");
+
+ assertFalse(json.isBoolean());
+ assertTrue(json.getAsBoolean());
+ }
+
+ public void testParsingStringAsNumber() throws Exception {
+ JsonPrimitive json = new JsonPrimitive("1");
+
+ assertFalse(json.isNumber());
+ assertEquals(1D, json.getAsDouble(), 0.00001);
+ assertEquals(1F, json.getAsFloat(), 0.00001);
+ assertEquals(1, json.getAsInt());
+ assertEquals(1L, json.getAsLong());
+ assertEquals((short) 1, json.getAsShort());
+ assertEquals((byte) 1, json.getAsByte());
+ assertEquals(new BigInteger("1"), json.getAsBigInteger());
+ assertEquals(new BigDecimal("1"), json.getAsBigDecimal());
+ }
+
+ public void testStringsAndChar() throws Exception {
+ JsonPrimitive json = new JsonPrimitive("abc");
+
+ assertTrue(json.isString());
+ assertEquals('a', json.getAsCharacter());
+ assertEquals("abc", json.getAsString());
+ }
+
+ public void testExponential() throws Exception {
+ JsonPrimitive json = new JsonPrimitive("1E+7");
+
+ assertEquals(new BigDecimal("1E+7"), json.getAsBigDecimal());
+ assertEquals(new Double("1E+7"), json.getAsDouble(), 0.00001);
+ assertEquals(new Float("1E+7"), json.getAsDouble(), 0.00001);
+
+ try {
+ json.getAsInt();
+ fail("Integers can not handle exponents like this.");
+ } catch (NumberFormatException expected) { }
+ }
+}