Skip to content
Open
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
@@ -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() {
}
Comment on lines +10 to +12
Copy link

Copilot AI Dec 16, 2025

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.

Copilot uses AI. Check for mistakes.

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
Copy link

Copilot AI Dec 16, 2025

Choose a reason for hiding this comment

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

The error message references the base class method but doesn't provide actionable guidance. Consider updating the message to explain that users should use the specific static instances (e.g., OF_INTEGER, OF_LONG) instead of calling the base write method directly, and provide an example of correct usage.

Suggested change
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 uses AI. Check for mistakes.
}
}
Comment on lines +10 to +219
Copy link

Copilot AI Dec 16, 2025

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.

Copilot uses AI. Check for mistakes.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Copy link

Copilot AI Dec 16, 2025

Choose a reason for hiding this comment

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

The instanceof check should use pattern matching or avoid redundant null check. Since this code checks if objectWriter is not null implicitly through the cache.get() call, the instanceof check will return false for null values anyway, making the explicit null check redundant. Consider simplifying to just check the instanceof condition.

Suggested change
if (objectWriter != null && objectWriter instanceof ObjectWriterAsString) {
if (objectWriter instanceof ObjectWriterAsString) {

Copilot uses AI. Check for mistakes.
return objectWriter;
}
}
return null;
}
Expand Down
Loading