-
Notifications
You must be signed in to change notification settings - Fork 544
Attempt to provide a built-in WriteNonStringValueAsString serializer … #3909
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,219 @@ | ||||||||||||||||||||
| package com.alibaba.fastjson2.writer; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| import com.alibaba.fastjson2.JSONException; | ||||||||||||||||||||
| import com.alibaba.fastjson2.JSONWriter; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| import java.lang.reflect.Type; | ||||||||||||||||||||
| import java.math.BigDecimal; | ||||||||||||||||||||
| import java.math.BigInteger; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public abstract class ObjectWriterAsString implements ObjectWriter { | ||||||||||||||||||||
| private ObjectWriterAsString() { | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_INTEGER = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(((Number) object).intValue()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_INT_VALUE = OF_INTEGER; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_LONG = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(((Number) object).longValue()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_LONG_VALUE = OF_LONG; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_FLOAT = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(((Number) object).floatValue()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_FLOAT_VALUE = OF_FLOAT; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_DOUBLE = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(((Number) object).doubleValue()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_DOUBLE_VALUE = OF_DOUBLE; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_SHORT = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(((Number) object).shortValue()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_SHORT_VALUE = OF_SHORT; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_BYTE = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(((Number) object).byteValue()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_BYTE_VALUE = OF_BYTE; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_CHARACTER = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(object.toString()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_CHAR_VALUE = OF_CHARACTER; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_BOOLEAN = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString(((Boolean) object).booleanValue()); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
| public static final ObjectWriterAsString OF_BOOLEAN_VALUE = OF_BOOLEAN; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_BIG_INTEGER = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeBigInt((BigInteger) object, JSONWriter.Feature.WriteNonStringValueAsString.mask); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_BIG_DECIMAL = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeDecimal((BigDecimal) object, JSONWriter.Feature.WriteNonStringValueAsString.mask, null); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_INT_ARRAY = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString((int[]) object); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_LONG_ARRAY = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString((long[]) object); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_FLOAT_ARRAY = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString((float[]) object); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_DOUBLE_ARRAY = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString((double[]) object); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_SHORT_ARRAY = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString((short[]) object); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_BYTE_ARRAY = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString((byte[]) object); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| public static final ObjectWriterAsString OF_BOOLEAN_ARRAY = new ObjectWriterAsString() { | ||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object != null) { | ||||||||||||||||||||
| jsonWriter.writeString((boolean[]) object); | ||||||||||||||||||||
| } else { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| }; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| @Override | ||||||||||||||||||||
| public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { | ||||||||||||||||||||
| if (object == null) { | ||||||||||||||||||||
| jsonWriter.writeNull(); | ||||||||||||||||||||
| return; | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| throw new JSONException("ObjectWriterAsString.write() should NOT be called directly: " | ||||||||||||||||||||
| + object.getClass().getName()); | ||||||||||||||||||||
|
Comment on lines
+216
to
+217
|
||||||||||||||||||||
| throw new JSONException("ObjectWriterAsString.write() should NOT be called directly: " | |
| + object.getClass().getName()); | |
| throw new JSONException( | |
| "ObjectWriterAsString.write() should NOT be called directly for type: " | |
| + object.getClass().getName() | |
| + ".\n" | |
| + "Please use one of the specific static instances (e.g., ObjectWriterAsString.OF_INTEGER, ObjectWriterAsString.OF_LONG) instead.\n" | |
| + "Example: ObjectWriterAsString.OF_INTEGER.write(jsonWriter, value, fieldName, fieldType, features);" | |
| ); |
Copilot
AI
Dec 16, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The new ObjectWriterAsString class lacks test coverage. Since this is a new public API that provides built-in serializers for base types, tests should be added to verify that each serializer instance correctly serializes values as strings, handles null values properly, and integrates correctly when registered with ObjectWriterProvider. Consider adding tests that cover scenarios like registering these writers globally and verifying their usage through the ObjectWriterCreator.getInitWriter method.
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -5,7 +5,7 @@ | |||||
| import com.alibaba.fastjson2.JSONWriter; | ||||||
| import com.alibaba.fastjson2.codec.BeanInfo; | ||||||
| import com.alibaba.fastjson2.codec.FieldInfo; | ||||||
| import com.alibaba.fastjson2.filter.*; | ||||||
| import com.alibaba.fastjson2.filter.Filter; | ||||||
| import com.alibaba.fastjson2.function.*; | ||||||
| import com.alibaba.fastjson2.modules.ObjectWriterModule; | ||||||
| import com.alibaba.fastjson2.util.BeanUtils; | ||||||
|
|
@@ -1946,6 +1946,11 @@ protected ObjectWriter getInitWriter(ObjectWriterProvider provider, Class fieldC | |||||
| if (!(objectWriter instanceof ObjectWriterImplEnum)) { | ||||||
| return objectWriter; | ||||||
| } | ||||||
| } else { | ||||||
| ObjectWriter objectWriter = provider.cache.get(fieldClass); | ||||||
| if (objectWriter != null && objectWriter instanceof ObjectWriterAsString) { | ||||||
|
||||||
| if (objectWriter != null && objectWriter instanceof ObjectWriterAsString) { | |
| if (objectWriter instanceof ObjectWriterAsString) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The class and its public static fields lack documentation. Since this is a public API that users will directly interact with to register custom serializers, comprehensive JavaDoc should be added to explain the purpose of this class, when to use it, and provide usage examples. Each public static field should also have documentation explaining what type it serializes.