in core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreator.java [2787:3117]
public <T> FieldReader<T> createFieldReader(
Class objectClass,
Type objectType,
String fieldName,
int ordinal,
long features,
String format,
Locale locale,
Object defaultValue,
String schema,
Type fieldType,
Class fieldClass,
Field field,
ObjectReader initReader,
String keyName,
BiConsumer arrayToMapDuplicateHandler
) {
if (defaultValue instanceof String && fieldClass.isEnum()) {
defaultValue = Enum.valueOf(fieldClass, (String) defaultValue);
}
if (defaultValue != null && defaultValue.getClass() != fieldClass) {
ObjectReaderProvider provider = JSONFactory
.getDefaultObjectReaderProvider();
Function typeConvert = provider.getTypeConvert(defaultValue.getClass(), fieldType);
if (typeConvert != null) {
defaultValue = typeConvert.apply(defaultValue);
} else {
throw new JSONException("illegal defaultValue : " + defaultValue + ", class " + fieldClass.getName());
}
}
JSONSchema jsonSchema = null;
if (schema != null && !schema.isEmpty()) {
JSONObject object = JSON.parseObject(schema);
if (!object.isEmpty()) {
jsonSchema = JSONSchema.of(object, fieldClass);
}
}
if (field != null) {
String objectClassName = objectClass.getName();
if (!objectClassName.startsWith("java.lang") && !objectClassName.startsWith("java.time") && !field.getDeclaringClass().getName().startsWith("java.lang") && !field.getDeclaringClass().getName().startsWith("java.time")) {
field.setAccessible(true);
}
}
if (initReader != null) {
FieldReaderObjectField fieldReader = new FieldReaderObjectField(fieldName, fieldType, fieldClass, ordinal, features | FieldInfo.READ_USING_MASK, format, locale, defaultValue, jsonSchema, field);
fieldReader.initReader = initReader;
return fieldReader;
}
if (fieldClass == int.class) {
return new FieldReaderInt32ValueField(fieldName, fieldClass, ordinal, format, (Integer) defaultValue, jsonSchema, field);
}
if (fieldClass == Integer.class) {
return new FieldReaderInt32Field(fieldName, fieldClass, ordinal, features, format, (Integer) defaultValue, jsonSchema, field);
}
if (fieldClass == long.class) {
return new FieldReaderInt64ValueField(fieldName, fieldClass, ordinal, features, format, (Long) defaultValue, jsonSchema, field);
}
if (fieldClass == Long.class) {
return new FieldReaderInt64Field(fieldName, fieldClass, ordinal, features, format, (Long) defaultValue, jsonSchema, field);
}
if (fieldClass == short.class) {
return new FieldReaderInt16ValueField(fieldName, fieldClass, ordinal, features, format, (Short) defaultValue, jsonSchema, field);
}
if (fieldClass == Short.class) {
return new FieldReaderInt16Field(fieldName, fieldClass, ordinal, features, format, (Short) defaultValue, jsonSchema, field);
}
if (fieldClass == boolean.class) {
return new FieldReaderBoolValueField(fieldName, ordinal, features, format, (Boolean) defaultValue, jsonSchema, field);
}
if (fieldClass == Boolean.class) {
return new FieldReaderBoolField(fieldName, fieldClass, ordinal, features, format, (Boolean) defaultValue, jsonSchema, field);
}
if (fieldClass == byte.class) {
return new FieldReaderInt8ValueField(fieldName, fieldClass, ordinal, features, format, (Byte) defaultValue, jsonSchema, field);
}
if (fieldClass == Byte.class) {
return new FieldReaderInt8Field(fieldName, fieldClass, ordinal, features, format, (Byte) defaultValue, jsonSchema, field);
}
if (fieldClass == float.class) {
return new FieldReaderFloatValueField(fieldName, fieldClass, ordinal, features, format, (Float) defaultValue, jsonSchema, field);
}
if (fieldClass == Float.class) {
return new FieldReaderFloatField(fieldName, fieldClass, ordinal, features, format, (Float) defaultValue, jsonSchema, field);
}
if (fieldClass == double.class) {
return new FieldReaderDoubleValueField(fieldName, fieldClass, ordinal, features, format, (Double) defaultValue, jsonSchema, field);
}
if (fieldClass == Double.class) {
return new FieldReaderDoubleField(fieldName, fieldClass, ordinal, features, format, (Double) defaultValue, jsonSchema, field);
}
if (fieldClass == char.class) {
return new FieldReaderCharValueField(fieldName, ordinal, features, format, (Character) defaultValue, jsonSchema, field);
}
if (fieldClass == BigDecimal.class) {
return new FieldReaderBigDecimalField(fieldName, fieldClass, ordinal, features, format, (BigDecimal) defaultValue, jsonSchema, field);
}
if (fieldClass == BigInteger.class) {
return new FieldReaderBigIntegerField(fieldName, fieldClass, ordinal, features, format, (BigInteger) defaultValue, jsonSchema, field);
}
if (fieldClass == String.class) {
return new FieldReaderStringField(fieldName, fieldClass, ordinal, features, format, (String) defaultValue, jsonSchema, field);
}
if (fieldType == String[].class) {
return new FieldReaderStringArray(
fieldName,
fieldType,
fieldClass,
ordinal,
features,
format,
locale,
defaultValue,
jsonSchema,
null,
field,
null
);
}
if (fieldClass == Date.class) {
return new FieldReaderDate(fieldName, fieldType, fieldClass, ordinal, features, format, locale, defaultValue, jsonSchema, field, null, null);
}
if (fieldClass == AtomicBoolean.class) {
return new FieldReaderAtomicBooleanFieldReadOnly(fieldName, fieldClass, ordinal, format, (AtomicBoolean) defaultValue, jsonSchema, field);
}
if (fieldClass == AtomicReference.class) {
return new FieldReaderAtomicReferenceField(fieldName, fieldType, fieldClass, ordinal, format, jsonSchema, field);
}
Type fieldTypeResolved = null;
Class fieldClassResolved = null;
if (!(fieldType instanceof Class)) {
fieldTypeResolved = BeanUtils.getFieldType(TypeReference.get(objectType), objectClass, field, fieldType);
fieldClassResolved = TypeUtils.getMapping(fieldTypeResolved);
}
boolean finalField = Modifier.isFinal(field.getModifiers());
if (Collection.class.isAssignableFrom(fieldClass)) {
if (fieldTypeResolved instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) fieldTypeResolved;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
if (actualTypeArguments.length == 1) {
Type itemType = actualTypeArguments[0];
Class itemClass = TypeUtils.getMapping(itemType);
if (itemClass == String.class) {
if (finalField) {
if ((features & JSONReader.Feature.FieldBased.mask) != 0) {
return new FieldReaderListField(fieldName, fieldTypeResolved, fieldClassResolved, String.class, String.class, ordinal, features, format, locale, null, jsonSchema, field);
}
return new FieldReaderCollectionFieldReadOnly(fieldName, fieldTypeResolved, fieldClassResolved, ordinal, features, format, jsonSchema, field);
}
return new FieldReaderListField(fieldName, fieldTypeResolved, fieldClassResolved, String.class, String.class, ordinal, features, format, locale, null, jsonSchema, field);
}
return new FieldReaderListField(
fieldName,
fieldTypeResolved,
fieldClassResolved,
itemType,
itemClass,
ordinal,
features,
format,
locale,
(Collection) defaultValue,
jsonSchema,
field
);
}
}
Type itemType = null;
if (fieldType instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) fieldType).getActualTypeArguments();
if (actualTypeArguments.length > 0) {
itemType = actualTypeArguments[0];
}
}
if (itemType == null) {
itemType = Object.class;
}
Class itemClass = TypeUtils.getClass(itemType);
return new FieldReaderListField(
fieldName,
fieldType,
fieldClass,
itemType,
itemClass,
ordinal,
features,
format,
locale,
(Collection) defaultValue,
jsonSchema,
field
);
}
if (Map.class.isAssignableFrom(fieldClass)) {
if (fieldTypeResolved instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) fieldTypeResolved;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
if (actualTypeArguments.length == 2) {
if (finalField && ((features & JSONReader.Feature.FieldBased.mask) == 0)) {
return new FieldReaderMapFieldReadOnly(
fieldName,
fieldTypeResolved,
fieldClassResolved,
ordinal,
features,
format,
jsonSchema,
field,
keyName,
arrayToMapDuplicateHandler
);
}
}
}
}
if (finalField) {
if (fieldClass == int[].class) {
return new FieldReaderInt32ValueArrayFinalField(fieldName, fieldClass, ordinal, features, format, (int[]) defaultValue, jsonSchema, field);
}
if (fieldClass == long[].class) {
return new FieldReaderInt64ValueArrayFinalField(fieldName, fieldClass, ordinal, features, format, (long[]) defaultValue, jsonSchema, field);
}
}
if (fieldClassResolved != null) {
if ((features & FieldInfo.UNWRAPPED_MASK) != 0
&& Map.class.isAssignableFrom(fieldClassResolved)
) {
return new FieldReaderMapFieldReadOnly(fieldName,
fieldTypeResolved,
fieldClass,
ordinal,
features,
format,
jsonSchema,
field,
keyName,
arrayToMapDuplicateHandler
);
}
if (Map.class.isAssignableFrom(fieldClassResolved)) {
if ((features & FieldInfo.UNWRAPPED_MASK) != 0) {
return new FieldReaderMapFieldReadOnly(fieldName,
fieldTypeResolved,
fieldClass,
ordinal,
features,
format,
jsonSchema,
field,
keyName,
arrayToMapDuplicateHandler
);
}
return new FieldReaderMapField(
fieldName,
fieldTypeResolved,
fieldClass,
ordinal,
features,
format,
locale,
defaultValue,
jsonSchema,
field,
keyName,
arrayToMapDuplicateHandler
);
}
return new FieldReaderObjectField(
fieldName,
fieldTypeResolved,
fieldClass,
ordinal,
features,
format,
locale,
defaultValue,
jsonSchema,
field);
}
if (fieldClass == LocalDateTime.class) {
return new FieldReaderLocalDateTime(fieldName, fieldType, fieldClass, ordinal, features, format, locale, defaultValue, jsonSchema, field, null, null);
}
if (fieldClass == ZonedDateTime.class) {
return new FieldReaderZonedDateTime(fieldName, fieldType, fieldClass, ordinal, features, format, locale, defaultValue, jsonSchema, field, null, null);
}
if (fieldClass == Instant.class) {
return new FieldReaderInstant(fieldName, fieldType, fieldClass, ordinal, features, format, locale, defaultValue, jsonSchema, field, null, null);
}
return new FieldReaderObjectField(fieldName, fieldType, fieldClass, ordinal, features, format, locale, defaultValue, jsonSchema, field);
}