Throw the right exceptions when primitives fail to parse.
This commit is contained in:
parent
ba283925ae
commit
e19672d0a3
|
@ -3,8 +3,21 @@ What's new in GSON 2.0
|
||||||
GSON 1.x used to automatically unwrap single-element arrays as necessary.
|
GSON 1.x used to automatically unwrap single-element arrays as necessary.
|
||||||
GSON 2.x doesn't.
|
GSON 2.x doesn't.
|
||||||
com.google.gson.functional.ArrayTest.testSingleStringArrayDeserialization
|
com.google.gson.functional.ArrayTest.testSingleStringArrayDeserialization
|
||||||
|
com.google.gson.functional.PrimitiveTest#testPrimitiveIntegerAutoboxedInASingleElementArrayDeserialization
|
||||||
|
com.google.gson.functional.PrimitiveTest#testPrimitiveLongAutoboxedInASingleElementArrayDeserialization
|
||||||
|
com.google.gson.functional.PrimitiveTest#testPrimitiveBooleanAutoboxedDeserialization
|
||||||
|
com.google.gson.functional.PrimitiveTest.testPrimitiveBooleanAutoboxedInASingleElementArrayDeserialization
|
||||||
|
com.google.gson.functional.PrimitiveTest.testPrimitiveDoubleAutoboxedInASingleElementArrayDeserialization
|
||||||
|
com.google.gson.functional.PrimitiveTest.testBigDecimalInASingleElementArrayDeserialization
|
||||||
|
com.google.gson.functional.PrimitiveTest.testBigIntegerInASingleElementArrayDeserialization
|
||||||
|
|
||||||
|
|
||||||
GSON 1.x permitted primitive types to be overridden
|
GSON 1.x permitted primitive types to be overridden
|
||||||
GSON 2.x doesn't.
|
GSON 2.x doesn't.
|
||||||
com.google.gson.functional.ArrayTest.testArrayOfPrimitivesWithCustomTypeAdapter
|
com.google.gson.functional.ArrayTest.testArrayOfPrimitivesWithCustomTypeAdapter
|
||||||
|
com.google.gson.functional.PrimitiveTest.testOverridingDefaultPrimitiveSerialization
|
||||||
|
|
||||||
|
|
||||||
|
GSON 1.x rejects integers that have any fraction, even if it is ".0"
|
||||||
|
GSON 2.x permits integers to have ".0" fractions like "1.0"
|
||||||
|
com.google.gson.functional.PrimitiveTest.testDeserializingDecimalPointValuesAsIntegerFails
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package com.google.gson.internal.bind;
|
package com.google.gson.internal.bind;
|
||||||
|
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.google.gson.stream.JsonReader;
|
import com.google.gson.stream.JsonReader;
|
||||||
import com.google.gson.stream.JsonWriter;
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
|
||||||
|
@ -31,7 +32,11 @@ public class BigDecimalTypeAdapter extends TypeAdapter<BigDecimal> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BigDecimal read(JsonReader reader) throws IOException {
|
public BigDecimal read(JsonReader reader) throws IOException {
|
||||||
return new BigDecimal(reader.nextString());
|
try {
|
||||||
|
return new BigDecimal(reader.nextString());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new JsonSyntaxException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package com.google.gson.internal.bind;
|
package com.google.gson.internal.bind;
|
||||||
|
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.google.gson.stream.JsonReader;
|
import com.google.gson.stream.JsonReader;
|
||||||
import com.google.gson.stream.JsonWriter;
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
|
||||||
|
@ -31,7 +32,11 @@ public class BigIntegerTypeAdapter extends TypeAdapter<BigInteger> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BigInteger read(JsonReader reader) throws IOException {
|
public BigInteger read(JsonReader reader) throws IOException {
|
||||||
return new BigInteger(reader.nextString());
|
try {
|
||||||
|
return new BigInteger(reader.nextString());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new JsonSyntaxException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package com.google.gson.internal.bind;
|
package com.google.gson.internal.bind;
|
||||||
|
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
import com.google.gson.stream.JsonReader;
|
import com.google.gson.stream.JsonReader;
|
||||||
import com.google.gson.stream.JsonToken;
|
import com.google.gson.stream.JsonToken;
|
||||||
|
@ -49,8 +50,12 @@ public final class TypeAdapters {
|
||||||
|
|
||||||
public static final TypeAdapter<Number> BYTE = new TypeAdapter<Number>() {
|
public static final TypeAdapter<Number> BYTE = new TypeAdapter<Number>() {
|
||||||
public Number read(JsonReader reader) throws IOException {
|
public Number read(JsonReader reader) throws IOException {
|
||||||
int intValue = reader.nextInt();
|
try {
|
||||||
return (byte) intValue;
|
int intValue = reader.nextInt();
|
||||||
|
return (byte) intValue;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new JsonSyntaxException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void write(JsonWriter writer, Number value) throws IOException {
|
public void write(JsonWriter writer, Number value) throws IOException {
|
||||||
writer.value(value);
|
writer.value(value);
|
||||||
|
@ -62,7 +67,11 @@ public final class TypeAdapters {
|
||||||
|
|
||||||
public static final TypeAdapter<Number> SHORT = new TypeAdapter<Number>() {
|
public static final TypeAdapter<Number> SHORT = new TypeAdapter<Number>() {
|
||||||
public Number read(JsonReader reader) throws IOException {
|
public Number read(JsonReader reader) throws IOException {
|
||||||
return (short) reader.nextInt();
|
try {
|
||||||
|
return (short) reader.nextInt();
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new JsonSyntaxException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void write(JsonWriter writer, Number value) throws IOException {
|
public void write(JsonWriter writer, Number value) throws IOException {
|
||||||
writer.value(value);
|
writer.value(value);
|
||||||
|
@ -74,7 +83,11 @@ public final class TypeAdapters {
|
||||||
|
|
||||||
public static final TypeAdapter<Number> INTEGER = new TypeAdapter<Number>() {
|
public static final TypeAdapter<Number> INTEGER = new TypeAdapter<Number>() {
|
||||||
public Number read(JsonReader reader) throws IOException {
|
public Number read(JsonReader reader) throws IOException {
|
||||||
return reader.nextInt();
|
try {
|
||||||
|
return reader.nextInt();
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new JsonSyntaxException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void write(JsonWriter writer, Number value) throws IOException {
|
public void write(JsonWriter writer, Number value) throws IOException {
|
||||||
writer.value(value);
|
writer.value(value);
|
||||||
|
@ -86,7 +99,11 @@ public final class TypeAdapters {
|
||||||
|
|
||||||
public static final TypeAdapter<Number> LONG = new TypeAdapter<Number>() {
|
public static final TypeAdapter<Number> LONG = new TypeAdapter<Number>() {
|
||||||
public Number read(JsonReader reader) throws IOException {
|
public Number read(JsonReader reader) throws IOException {
|
||||||
return reader.nextLong();
|
try {
|
||||||
|
return reader.nextLong();
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new JsonSyntaxException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void write(JsonWriter writer, Number value) throws IOException {
|
public void write(JsonWriter writer, Number value) throws IOException {
|
||||||
writer.value(value);
|
writer.value(value);
|
||||||
|
|
|
@ -86,15 +86,6 @@ public class PrimitiveTest extends TestCase {
|
||||||
assertEquals("[-9332]", gson.toJson(target, Integer[].class));
|
assertEquals("[-9332]", gson.toJson(target, Integer[].class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPrimitiveIntegerAutoboxedInASingleElementArrayDeserialization() {
|
|
||||||
int expected = 1;
|
|
||||||
int actual = gson.fromJson("[1]", int.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
|
|
||||||
actual = gson.fromJson("[1]", Integer.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testReallyLongValuesSerialization() {
|
public void testReallyLongValuesSerialization() {
|
||||||
long value = 333961828784581L;
|
long value = 333961828784581L;
|
||||||
assertEquals("333961828784581", gson.toJson(value));
|
assertEquals("333961828784581", gson.toJson(value));
|
||||||
|
@ -127,24 +118,12 @@ public class PrimitiveTest extends TestCase {
|
||||||
assertEquals("[-23]", gson.toJson(target, Long[].class));
|
assertEquals("[-23]", gson.toJson(target, Long[].class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPrimitiveLongAutoboxedInASingleElementArrayDeserialization() {
|
|
||||||
long expected = 1L;
|
|
||||||
long actual = gson.fromJson("[1]", long.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
|
|
||||||
actual = gson.fromJson("[1]", Long.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testPrimitiveBooleanAutoboxedSerialization() {
|
public void testPrimitiveBooleanAutoboxedSerialization() {
|
||||||
assertEquals("true", gson.toJson(true));
|
assertEquals("true", gson.toJson(true));
|
||||||
assertEquals("false", gson.toJson(false));
|
assertEquals("false", gson.toJson(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPrimitiveBooleanAutoboxedDeserialization() {
|
public void testBooleanDeserialization() {
|
||||||
assertEquals(Boolean.FALSE, gson.fromJson("[false]", Boolean.class));
|
|
||||||
assertEquals(Boolean.TRUE, gson.fromJson("[true]", Boolean.class));
|
|
||||||
|
|
||||||
boolean value = gson.fromJson("false", boolean.class);
|
boolean value = gson.fromJson("false", boolean.class);
|
||||||
assertEquals(false, value);
|
assertEquals(false, value);
|
||||||
value = gson.fromJson("true", boolean.class);
|
value = gson.fromJson("true", boolean.class);
|
||||||
|
@ -158,16 +137,6 @@ public class PrimitiveTest extends TestCase {
|
||||||
assertEquals("[false]", gson.toJson(target, Boolean[].class));
|
assertEquals("[false]", gson.toJson(target, Boolean[].class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPrimitiveBooleanAutoboxedInASingleElementArrayDeserialization() {
|
|
||||||
assertEquals(Boolean.FALSE, gson.fromJson("[false]", Boolean.class));
|
|
||||||
assertEquals(Boolean.TRUE, gson.fromJson("[true]", Boolean.class));
|
|
||||||
|
|
||||||
boolean value = gson.fromJson("[false]", boolean.class);
|
|
||||||
assertEquals(false, value);
|
|
||||||
value = gson.fromJson("[true]", boolean.class);
|
|
||||||
assertEquals(true, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testNumberSerialization() {
|
public void testNumberSerialization() {
|
||||||
Number expected = 1L;
|
Number expected = 1L;
|
||||||
String json = gson.toJson(expected);
|
String json = gson.toJson(expected);
|
||||||
|
@ -239,15 +208,6 @@ public class PrimitiveTest extends TestCase {
|
||||||
assertEquals(expected.doubleValue(), actual1);
|
assertEquals(expected.doubleValue(), actual1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPrimitiveDoubleAutoboxedInASingleElementArrayDeserialization() {
|
|
||||||
double expected = -122.08;
|
|
||||||
double actual = gson.fromJson("[-122.08]", double.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
|
|
||||||
actual = gson.fromJson("[-122.08]", Double.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testBigDecimalSerialization() {
|
public void testBigDecimalSerialization() {
|
||||||
BigDecimal target = new BigDecimal("-122.0e-21");
|
BigDecimal target = new BigDecimal("-122.0e-21");
|
||||||
String json = gson.toJson(target);
|
String json = gson.toJson(target);
|
||||||
|
@ -271,12 +231,6 @@ public class PrimitiveTest extends TestCase {
|
||||||
assertEquals(target[0], new BigDecimal(actual));
|
assertEquals(target[0], new BigDecimal(actual));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testBigDecimalInASingleElementArrayDeserialization() {
|
|
||||||
BigDecimal expected = new BigDecimal("-122.08e-21");
|
|
||||||
BigDecimal actual = gson.fromJson("[-122.08e-21]", BigDecimal.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testSmallValueForBigDecimalSerialization() {
|
public void testSmallValueForBigDecimalSerialization() {
|
||||||
BigDecimal target = new BigDecimal("1.55");
|
BigDecimal target = new BigDecimal("1.55");
|
||||||
String actual = gson.toJson(target);
|
String actual = gson.toJson(target);
|
||||||
|
@ -341,12 +295,6 @@ public class PrimitiveTest extends TestCase {
|
||||||
assertEquals(target[0], new BigInteger(actual));
|
assertEquals(target[0], new BigInteger(actual));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testBigIntegerInASingleElementArrayDeserialization() {
|
|
||||||
BigInteger expected = new BigInteger("34343434343424242423432323243243242");
|
|
||||||
BigInteger actual = gson.fromJson("[34343434343424242423432323243243242]", BigInteger.class);
|
|
||||||
assertEquals(expected, actual);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testSmallValueForBigIntegerSerialization() {
|
public void testSmallValueForBigIntegerSerialization() {
|
||||||
BigInteger target = new BigInteger("15");
|
BigInteger target = new BigInteger("15");
|
||||||
String actual = gson.toJson(target);
|
String actual = gson.toJson(target);
|
||||||
|
@ -363,7 +311,7 @@ public class PrimitiveTest extends TestCase {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("15.099", BigInteger.class);
|
gson.fromJson("15.099", BigInteger.class);
|
||||||
fail("BigInteger can not be decimal values.");
|
fail("BigInteger can not be decimal values.");
|
||||||
} catch (JsonParseException expected) { }
|
} catch (JsonSyntaxException expected) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testMoreSpecificSerialization() {
|
public void testMoreSpecificSerialization() {
|
||||||
|
@ -376,20 +324,6 @@ public class PrimitiveTest extends TestCase {
|
||||||
assertFalse(expectedJson.equals(actualJson));
|
assertFalse(expectedJson.equals(actualJson));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testOverridingDefaultPrimitiveSerialization() {
|
|
||||||
CrazyLongTypeAdapter typeAdapter = new CrazyLongTypeAdapter();
|
|
||||||
gson = new GsonBuilder()
|
|
||||||
.registerTypeAdapter(long.class, typeAdapter)
|
|
||||||
.registerTypeAdapter(Long.class, typeAdapter)
|
|
||||||
.create();
|
|
||||||
long value = 1L;
|
|
||||||
String serializedValue = gson.toJson(value);
|
|
||||||
assertEquals(String.valueOf(value + CrazyLongTypeAdapter.DIFFERENCE), serializedValue);
|
|
||||||
|
|
||||||
long deserializedValue = gson.fromJson(serializedValue, long.class);
|
|
||||||
assertEquals(value, deserializedValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String extractElementFromArray(String json) {
|
private String extractElementFromArray(String json) {
|
||||||
return json.substring(json.indexOf('[') + 1, json.indexOf(']'));
|
return json.substring(json.indexOf('[') + 1, json.indexOf(']'));
|
||||||
}
|
}
|
||||||
|
@ -450,7 +384,7 @@ public class PrimitiveTest extends TestCase {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("NaN", BigDecimal.class);
|
gson.fromJson("NaN", BigDecimal.class);
|
||||||
fail("Gson should not accept NaN for deserialization by default.");
|
fail("Gson should not accept NaN for deserialization by default.");
|
||||||
} catch (JsonParseException expected) {
|
} catch (JsonSyntaxException expected) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -510,7 +444,7 @@ public class PrimitiveTest extends TestCase {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("Infinity", BigDecimal.class);
|
gson.fromJson("Infinity", BigDecimal.class);
|
||||||
fail("Gson should not accept positive infinity for deserialization with BigDecimal");
|
fail("Gson should not accept positive infinity for deserialization with BigDecimal");
|
||||||
} catch (JsonParseException expected) {
|
} catch (JsonSyntaxException expected) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -570,7 +504,7 @@ public class PrimitiveTest extends TestCase {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("-Infinity", BigDecimal.class);
|
gson.fromJson("-Infinity", BigDecimal.class);
|
||||||
fail("Gson should not accept positive infinity for deserialization");
|
fail("Gson should not accept positive infinity for deserialization");
|
||||||
} catch (JsonParseException expected) {
|
} catch (JsonSyntaxException expected) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -778,11 +712,30 @@ public class PrimitiveTest extends TestCase {
|
||||||
} catch (JsonSyntaxException expected) {}
|
} catch (JsonSyntaxException expected) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDeserializingDecimalPointValuesAsIntegerFails() {
|
public void testDeserializingDecimalPointValueZeroSucceeds() {
|
||||||
|
assertEquals(1, (int) gson.fromJson("1.0", Integer.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeserializingNonZeroDecimalPointValuesAsIntegerFails() {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("1.0", Integer.class);
|
gson.fromJson("1.02", Byte.class);
|
||||||
fail();
|
fail();
|
||||||
} catch (JsonParseException expected) {
|
} catch (JsonSyntaxException expected) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
gson.fromJson("1.02", Short.class);
|
||||||
|
fail();
|
||||||
|
} catch (JsonSyntaxException expected) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
gson.fromJson("1.02", Integer.class);
|
||||||
|
fail();
|
||||||
|
} catch (JsonSyntaxException expected) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
gson.fromJson("1.02", Long.class);
|
||||||
|
fail();
|
||||||
|
} catch (JsonSyntaxException expected) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -790,7 +743,7 @@ public class PrimitiveTest extends TestCase {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("-122.08e-213", Integer.class);
|
gson.fromJson("-122.08e-213", Integer.class);
|
||||||
fail();
|
fail();
|
||||||
} catch (JsonParseException expected) {
|
} catch (JsonSyntaxException expected) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -812,7 +765,7 @@ public class PrimitiveTest extends TestCase {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("-122.08e-2132", long.class);
|
gson.fromJson("-122.08e-2132", long.class);
|
||||||
fail();
|
fail();
|
||||||
} catch (JsonParseException expected) {
|
} catch (JsonSyntaxException expected) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -832,7 +785,7 @@ public class PrimitiveTest extends TestCase {
|
||||||
try {
|
try {
|
||||||
gson.fromJson("-122.08e-213", BigInteger.class);
|
gson.fromJson("-122.08e-213", BigInteger.class);
|
||||||
fail();
|
fail();
|
||||||
} catch (JsonParseException expected) {
|
} catch (JsonSyntaxException expected) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user