An extension library for Gson Path that adds validation that does not exist in the core Gson Path library. The library supports Android Support Library annotations (without including the dependency), but also includes the FloatRange, IntRange and Size for non-Android projects.
- This library currently supports validation for
@FloatRange,@IntRange,@StringDefand@IntDef. - The
@EmptyToNullannotation bundled in the library will convert empty strings, arrays, collections or maps to null.- If the value marked with
@EmptyToNullis also marked with a@NonNull(or similar) annotation, it will throw an exception.
- If the value marked with
The following is an example of @FloatRange annotation validation.
@AutoGsonAdapter
interface FloatModel extends BaseFloatModel {
@FloatRange(from = 0, to = 5, fromInclusive = false, toInclusive = false)
Float getValue();
}// Gsonpath Extensions
if (value_value != null) {
// Extension - 'FloatRange' Annotation
if (value_value <= 0.0) {
throw new com.google.gson.JsonParseException("Invalid 'from' range for value. Expected: '> 0.0', Found '" + value_value + "'");
}
if (value_value >= 5.0) {
throw new com.google.gson.JsonParseException("Invalid 'to' range for value. Expected: '< 5.0', Found '" + value_value + "'");
}
}The following is an example of @IntRange annotation validation.
@AutoGsonAdapter
interface IntModel extends BaseModel<Integer> {
@IntRange(from = 0, to = 5)
Integer getValue();
}// Gsonpath Extensions
if (value_value != null) {
// Extension - 'IntRange' Annotation
if (value_value < 0) {
throw new com.google.gson.JsonParseException("Invalid 'from' range for value. Expected: '>= 0', Found '" + value_value + "'");
}
if (value_value > 5) {
throw new com.google.gson.JsonParseException("Invalid 'to' range for value. Expected: '<= 5', Found '" + value_value + "'");
}
}The following is an example of @Size annotation validation.
@AutoGsonAdapter
interface ArrayModel extends BaseArrayModel {
@Size(min = 0, max = 6, multiple = 2, value = 2)
Integer[] getValue();
}// Gsonpath Extensions
if (value_value != null) {
// Extension - 'Size' Annotation
if (value_value.length != 2) {
throw new com.google.gson.JsonParseException("Invalid array length for field 'value'. Expected length: '2', actual length: '" + value_value.length + "'");
}
if (value_value.length < 0) {
throw new com.google.gson.JsonParseException("Invalid array length for field 'value'. Expected minimum: '0', actual minimum: '" + value_value.length + "'");
}
if (value_value.length > 6) {
throw new com.google.gson.JsonParseException("Invalid array length for field 'value'. Expected maximum: '6', actual maximum: '" + value_value.length + "'");
}
if (value_value.length % 2 != 0) {
throw new com.google.gson.JsonParseException("Invalid array length for field 'value'. length of '" + value_value.length + "' is not a multiple of 2");
}
}The following is an example of @IntDef annotation validation.
@AutoGsonAdapter
interface IntDefModel {
@IntDefExample
Integer getValue();
@Retention(RetentionPolicy.SOURCE)
@IntDef({VALUE_1, VALUE_2})
@interface IntDefExample {
int VALUE_1 = 1;
int VALUE_2 = 2;
}
}// Gsonpath Extensions
if (value_value != null) {
// Extension - 'Int Def' Annotation
switch (value_value) {
case 1:
case 2:
break;
default:
throw new com.google.gson.JsonParseException("Unexpected Int '" + value_value + "' for field 'value'");
}
}The following is an example of @StringDef annotation validation. Note that the switch statement reassigns the string value to the actual constant from the @StringDef annotation. This is to appease the support library linting rules in Android Studio.
@AutoGsonAdapter
interface StringDefModel {
@StringDefExample
String getValue();
@Retention(RetentionPolicy.SOURCE)
@StringDef({VALUE_1, VALUE_2})
@interface StringDefExample {
String VALUE_1 = "1";
String VALUE_2 = "2";
}
}// Gsonpath Extensions
if (value_value != null) {
// Extension - 'String Def' Annotation
switch (value_value) {
case StringDefExample.VALUE_1:
value_value = StringDefExample.VALUE_1;
break;
case StringDefExample.VALUE_2:
value_value = StringDefExample.VALUE_2;
break;
default:
throw new com.google.gson.JsonParseException("Unexpected String '" + value_value + "' for field 'value'");
}
}The following is an example of @EmptyToNull annotation validation.
@AutoGsonAdapter
interface StringDefModel {
@EmptyToNull
String getNullableString();
@EmptyToNull
String[] getNullableArray();
@EmptyToNull
Collection<String> getNullableCollection();
@EmptyToNull
Map<String, String> getNullableMap();
@NonNull
@EmptyToNull
String getNonNullString();
@NonNull
@EmptyToNull
String[] getNonNullArray();
@NonNull
@EmptyToNull
Collection<String> getNonNullCollection();
@NonNull
@EmptyToNull
Map<String, String> getNonNullMap();
}// Extension - 'EmptyToNull' Annotation
if (nullableString.trim().length() == 0) {
nullableString = null;
}
if (nullableArray.length == 0) {
nullableArray = null;
}
if (nullableCollection.size() == 0) {
nullableCollection = null;
}
if (nullableMap.size() == 0) {
nullableMap = null;
}
if (nonNullString.trim().length() == 0) {
throw new com.google.gson.JsonParseException("JSON element 'nonNullString' cannot be blank");
}
if (nonNullArray.length == 0) {
throw new com.google.gson.JsonParseException("JSON element 'nonNullArray' cannot be blank");
}
if (nonNullCollection.size() == 0) {
throw new com.google.gson.JsonParseException("JSON element 'nonNullCollection' cannot be blank");
}
if (nonNullMap.size() == 0) {
throw new com.google.gson.JsonParseException("JSON element 'nonNullMap' cannot be blank");
}This library is available on Maven, you can add it to your project using the following gradle dependencies:
apt 'net.lachlanmckee:gsonpath-extensions:1.1.0'