Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.function.BiConsumer;

final class FieldReaderBigDecimal<T, V>
extends FieldReader<T> {
extends FieldReaderBoxedType<T, BigDecimal> {
public FieldReaderBigDecimal(
String fieldName,
Class<V> fieldClass,
Expand All @@ -24,32 +24,11 @@ public FieldReaderBigDecimal(
Field field,
BiConsumer<T, V> function
) {
super(fieldName, fieldClass, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, null, null);
super(fieldName, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, null, null);
}

@Override
public void accept(T object, Object value) {
propertyAccessor.setObject(object, value);
}

@Override
public void readFieldValue(JSONReader jsonReader, T object) {
BigDecimal fieldValue;
try {
fieldValue = jsonReader.readBigDecimal();
} catch (Exception e) {
if ((jsonReader.features(this.features) & JSONReader.Feature.NullOnError.mask) != 0) {
fieldValue = null;
} else {
throw e;
}
}

propertyAccessor.setObject(object, fieldValue);
}

@Override
public Object readFieldValue(JSONReader jsonReader) {
protected BigDecimal readValue(JSONReader jsonReader) {
return jsonReader.readBigDecimal();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.util.function.BiConsumer;

final class FieldReaderBool<T, V>
extends FieldReader<T> {
extends FieldReaderBoxedType<T, Boolean> {
public FieldReaderBool(
String fieldName,
Class<V> fieldClass,
Expand All @@ -27,33 +27,22 @@ public FieldReaderBool(
String paramName,
Parameter parameter
) {
super(fieldName, fieldClass, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
super(fieldName, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
}

@Override
public void accept(T object, Object value) {
propertyAccessor.setObject(object,
TypeUtils.toBoolean(value));
}
Boolean boolValue = TypeUtils.toBoolean(value);

@Override
public void readFieldValue(JSONReader jsonReader, T object) {
Boolean fieldValue;
try {
fieldValue = jsonReader.readBool();
} catch (Exception e) {
if ((jsonReader.features(this.features) & JSONReader.Feature.NullOnError.mask) != 0) {
fieldValue = null;
} else {
throw e;
}
if (schema != null) {
schema.assertValidate(boolValue);
}

propertyAccessor.setObject(object, fieldValue);
propertyAccessor.setObject(object, boolValue);
}

@Override
public Object readFieldValue(JSONReader jsonReader) {
protected Boolean readValue(JSONReader jsonReader) {
return jsonReader.readBool();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.alibaba.fastjson2.reader;

import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.schema.JSONSchema;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Locale;
import java.util.function.BiConsumer;

/**
* Abstract base class for boxed type field readers (Integer, Long, Double, Float, Boolean, etc.).
* Consolidates common error handling and schema validation logic.
*
* @param <T> the object type containing the field
* @param <V> the field value type
*/
abstract class FieldReaderBoxedType<T, V> extends FieldReader<T> {
FieldReaderBoxedType(
String fieldName,
Class fieldClass,
int ordinal,
long features,
String format,
Locale locale,
Object defaultValue,
JSONSchema schema,
Method method,
Field field,
BiConsumer function,
String paramName,
Parameter parameter
) {
super(fieldName, fieldClass, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
}

@Override
public void accept(T object, Object value) {
if (schema != null) {
schema.assertValidate(value);
}
propertyAccessor.setObject(object, value);
}

@Override
public void readFieldValue(JSONReader jsonReader, T object) {
V value;
try {
value = readValue(jsonReader);
} catch (Exception e) {
if ((jsonReader.features(this.features) & JSONReader.Feature.NullOnError.mask) != 0) {
value = null;
} else {
throw e;
}
}

if (schema != null) {
schema.assertValidate(value);
}

propertyAccessor.setObject(object, value);
}

@Override
public Object readFieldValue(JSONReader jsonReader) {
return readValue(jsonReader);
}

/**
* Read the specific value type from JSONReader.
* Subclasses must implement this to call the appropriate reader method.
*
* @param jsonReader the JSON reader
* @return the read value
*/
protected abstract V readValue(JSONReader jsonReader);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.function.BiConsumer;

final class FieldReaderDouble<T, V>
extends FieldReader<T> {
extends FieldReaderBoxedType<T, Double> {
FieldReaderDouble(
String fieldName,
Class<V> fieldClass,
Expand All @@ -26,19 +26,14 @@ final class FieldReaderDouble<T, V>
String paramName,
Parameter parameter
) {
super(fieldName, fieldClass, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
}

@Override
public void accept(T object, Object value) {
propertyAccessor.setObject(object, value);
super(fieldName, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
}

@Override
public void readFieldValue(JSONReader jsonReader, T object) {
Double value;
try {
value = jsonReader.readDouble();
value = readValue(jsonReader);
} catch (Exception e) {
if ((jsonReader.features(this.features) & JSONReader.Feature.NullOnError.mask) != 0) {
value = null;
Expand All @@ -51,11 +46,15 @@ public void readFieldValue(JSONReader jsonReader, T object) {
return;
}

if (schema != null) {
schema.assertValidate(value);
}

propertyAccessor.setObject(object, value);
}

@Override
public Object readFieldValue(JSONReader jsonReader) {
protected Double readValue(JSONReader jsonReader) {
return jsonReader.readDouble();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.function.BiConsumer;

final class FieldReaderFloat<T, V>
extends FieldReader<T> {
extends FieldReaderBoxedType<T, Float> {
FieldReaderFloat(
String fieldName,
Class<V> fieldClass,
Expand All @@ -26,32 +26,11 @@ final class FieldReaderFloat<T, V>
String paramName,
Parameter parameter
) {
super(fieldName, fieldClass, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
super(fieldName, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
}

@Override
public void accept(T object, Object value) {
propertyAccessor.setObject(object, value);
}

@Override
public void readFieldValue(JSONReader jsonReader, T object) {
Float value;
try {
value = jsonReader.readFloat();
} catch (Exception e) {
if ((jsonReader.features(this.features) & JSONReader.Feature.NullOnError.mask) != 0) {
value = null;
} else {
throw e;
}
}

propertyAccessor.setObject(object, value);
}

@Override
public Object readFieldValue(JSONReader jsonReader) {
protected Float readValue(JSONReader jsonReader) {
return jsonReader.readFloat();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.function.BiConsumer;

final class FieldReaderInt16<T, V>
extends FieldReader<T> {
extends FieldReaderBoxedType<T, Short> {
FieldReaderInt16(
String fieldName,
Class<V> fieldClass,
Expand All @@ -26,33 +26,12 @@ final class FieldReaderInt16<T, V>
String paramName,
Parameter parameter
) {
super(fieldName, fieldClass, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
super(fieldName, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
}

@Override
public void accept(T object, Object value) {
propertyAccessor.setObject(object, value);
}

@Override
public void readFieldValue(JSONReader jsonReader, T object) {
Short value;
try {
Integer intValue = jsonReader.readInt32();
value = intValue == null ? null : intValue.shortValue();
} catch (Exception e) {
if ((jsonReader.features(this.features) & JSONReader.Feature.NullOnError.mask) != 0) {
value = null;
} else {
throw e;
}
}

propertyAccessor.setObject(object, value);
}

@Override
public Object readFieldValue(JSONReader jsonReader) {
return jsonReader.readInt32();
protected Short readValue(JSONReader jsonReader) {
Integer intValue = jsonReader.readInt32();
return intValue == null ? null : intValue.shortValue();
}
Comment on lines +33 to 36

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

⚠️ readFieldValue(JSONReader) 返回值语义可能变化:Int16 现在返回 Short 而非原先的 Integer

同 Int8:重构前 FieldReaderInt16.readFieldValue(JSONReader) 返回 jsonReader.readInt32()(Integer),重构后继承基类返回 readValue(jsonReader)(Short)。这可能影响依赖返回类型为 Integer 的调用路径。

建议: 在 FieldReaderInt16 中覆盖 readFieldValue(JSONReader) 返回 Integer,保持兼容;readFieldValue(JSONReader,T) 仍通过 readValue 写入 Short。

Suggested change
protected Short readValue(JSONReader jsonReader) {
Integer intValue = jsonReader.readInt32();
return intValue == null ? null : intValue.shortValue();
}
@Override
public Object readFieldValue(JSONReader jsonReader) {
return jsonReader.readInt32();
}
@Override
protected Short readValue(JSONReader jsonReader) {
Integer intValue = jsonReader.readInt32();
return intValue == null ? null : intValue.shortValue();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.function.BiConsumer;

final class FieldReaderInt32<T, V>
extends FieldReader<T> {
extends FieldReaderBoxedType<T, Integer> {
FieldReaderInt32(
String fieldName,
Class<V> fieldClass,
Expand All @@ -26,32 +26,11 @@ final class FieldReaderInt32<T, V>
String paramName,
Parameter parameter
) {
super(fieldName, fieldClass, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
super(fieldName, fieldClass, ordinal, features, format, locale, defaultValue, schema, method, field, function, paramName, parameter);
}

@Override
public void accept(T object, Object value) {
propertyAccessor.setObject(object, value);
}

@Override
public void readFieldValue(JSONReader jsonReader, T object) {
Integer value;
try {
value = jsonReader.readInt32();
} catch (Exception e) {
if ((jsonReader.features(this.features) & JSONReader.Feature.NullOnError.mask) != 0) {
value = null;
} else {
throw e;
}
}

propertyAccessor.setObject(object, value);
}

@Override
public Object readFieldValue(JSONReader jsonReader) {
protected Integer readValue(JSONReader jsonReader) {
return jsonReader.readInt32();
}
}
Loading
Loading