in google-http-client/src/main/java/com/google/api/client/json/JsonGenerator.java [109:177]
private void serialize(boolean isJsonString, Object value) throws IOException {
if (value == null) {
return;
}
Class<?> valueClass = value.getClass();
if (Data.isNull(value)) {
writeNull();
} else if (value instanceof String) {
writeString((String) value);
} else if (value instanceof Number) {
if (isJsonString) {
writeString(value.toString());
} else if (value instanceof BigDecimal) {
writeNumber((BigDecimal) value);
} else if (value instanceof BigInteger) {
writeNumber((BigInteger) value);
} else if (value instanceof Long) {
writeNumber((Long) value);
} else if (value instanceof Float) {
float floatValue = ((Number) value).floatValue();
Preconditions.checkArgument(!Float.isInfinite(floatValue) && !Float.isNaN(floatValue));
writeNumber(floatValue);
} else if (value instanceof Integer || value instanceof Short || value instanceof Byte) {
writeNumber(((Number) value).intValue());
} else {
double doubleValue = ((Number) value).doubleValue();
Preconditions.checkArgument(!Double.isInfinite(doubleValue) && !Double.isNaN(doubleValue));
writeNumber(doubleValue);
}
} else if (value instanceof Boolean) {
writeBoolean((Boolean) value);
} else if (value instanceof DateTime) {
writeString(((DateTime) value).toStringRfc3339());
} else if (value instanceof Iterable<?> || valueClass.isArray()) {
writeStartArray();
for (Object o : Types.iterableOf(value)) {
serialize(isJsonString, o);
}
writeEndArray();
} else if (valueClass.isEnum()) {
String name = FieldInfo.of((Enum<?>) value).getName();
if (name == null) {
writeNull();
} else {
writeString(name);
}
} else {
writeStartObject();
// only inspect fields of POJO (possibly extends GenericData) but not generic Map
boolean isMapNotGenericData = value instanceof Map<?, ?> && !(value instanceof GenericData);
ClassInfo classInfo = isMapNotGenericData ? null : ClassInfo.of(valueClass);
for (Map.Entry<String, Object> entry : Data.mapOf(value).entrySet()) {
Object fieldValue = entry.getValue();
if (fieldValue != null) {
String fieldName = entry.getKey();
boolean isJsonStringForField;
if (isMapNotGenericData) {
isJsonStringForField = isJsonString;
} else {
Field field = classInfo.getField(fieldName);
isJsonStringForField = field != null && field.getAnnotation(JsonString.class) != null;
}
writeFieldName(fieldName);
serialize(isJsonStringForField, fieldValue);
}
}
writeEndObject();
}
}