Skip to content
Open
Show file tree
Hide file tree
Changes from 7 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 @@ -3885,6 +3885,11 @@ static ObjectReader getInitReader(
if (objectReader != ObjectReaderImplDate.INSTANCE) {
initReader = objectReader;
}
} else if (fieldClass == Instant.class) {
ObjectReader objectReader = provider.getObjectReader(Instant.class);
if (objectReader != ObjectReaderImplInstant.INSTANCE) {
initReader = objectReader;
}
}
}
return initReader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -679,6 +679,14 @@ public Object readObject(JSONReader jsonReader, Type fieldType, Object fieldName
break;
}

if (jsonReader.current() == '/') {
jsonReader.skipComment();
}

if (jsonReader.nextIfMatch(']')) {
break;
}

Object item;
if (itemType == String.class) {
item = jsonReader.readString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,16 +365,17 @@ private boolean writeInternal(JSONWriter jsonWriter, T object) {
}

Class<?> valueClass = value.getClass();
if (valueClass == byte[].class) {
writeBinary(jsonWriter, (byte[]) value);
return true;
}

ObjectWriter valueWriter = getObjectWriter(jsonWriter, valueClass);
if (valueWriter == null) {
throw new JSONException("get objectWriter error : " + valueClass);
}

if (valueClass == byte[].class
&& (valueWriter == ObjectWriterImplInt8Array.INSTANCE || valueWriter == ObjectWriterImplInt8ValueArray.INSTANCE)) {
writeBinary(jsonWriter, (byte[]) value);
return true;
}

if (unwrapped
&& writeWithUnwrapped(jsonWriter, value, features, refDetect, valueWriter)) {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -451,17 +451,18 @@ boolean record = BeanUtils.isRecord(objectClass);
}

long writerFieldFeatures = features | beanFeatures;
boolean fieldBased = (writerFieldFeatures & JSONWriter.Feature.FieldBased.mask) != 0;
boolean fieldBased = ((writerFieldFeatures & JSONWriter.Feature.FieldBased.mask) != 0 && !objectClass.isInterface())
|| !beanInfo.alphabetic;
Comment on lines -454 to +455
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

这里修复 creator=reflect 时,设置 alphabetic=false(序列化对象字段的输出顺序)不生效的问题;同时调整了其它地方,与 creator=asm 保持一致


if (fieldBased && (record || objectClass.isInterface())) {
if (fieldBased && record) {
fieldBased = false;
}

List<FieldWriter> fieldWriters;
Map<String, FieldWriter> fieldWriterMap = new LinkedHashMap<>();
final FieldInfo fieldInfo = new FieldInfo();

if (fieldBased) {
Map<String, FieldWriter> fieldWriterMap = new TreeMap<>();
BeanUtils.declaredFields(objectClass, field -> {
fieldInfo.init();
FieldWriter fieldWriter = createFieldWriter(objectClass, writerFieldFeatures, provider, beanInfo, fieldInfo, field);
Expand All @@ -484,8 +485,6 @@ boolean record = BeanUtils.isRecord(objectClass);
}

if (!fieldWritersCreated) {
Map<String, FieldWriter> fieldWriterMap = new LinkedHashMap<>();

if (!record) {
BeanUtils.declaredFields(objectClass, field -> {
fieldInfo.init();
Expand Down
147 changes: 147 additions & 0 deletions extension-vertx/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-parent</artifactId>
<version>2.0.62-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>fastjson2-extension-vertx</artifactId>
<name>fastjson2-extension-vertx</name>
<description>Fastjson is a JSON processor (JSON parser + JSON generator) written in Java</description>
<packaging>jar</packaging>
<url>https://github.com/alibaba/fastjson2</url>
<inceptionYear>2026</inceptionYear>

<licenses>
<license>
<name>Apache 2</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<scm>
<url>https://github.com/alibaba/fastjson2</url>
<connection>scm:git:https://git@github.com/alibaba/fastjson2.git</connection>
</scm>

<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>${maven.compiler.source}</maven.compiler.target>
</properties>

<organization>
<name>Alibaba Group</name>
<url>https://github.com/alibaba</url>
</organization>
<developers>
<developer>
<id>wenshao</id>
<name>wenshao</name>
<email>shaojin.wensj(at)alibaba-inc.com</email>
<roles>
<role>Developer</role>
<role>Tech Leader</role>
</roles>
<timezone>+8</timezone>
<url>https://github.com/wenshao</url>
</developer>
<developer>
<id>jujn</id>
<name>jujn</name>
<email>jth_xdu(at)qq.com</email>
<roles>
<role>Developer</role>
</roles>
<timezone>+8</timezone>
<url>https://github.com/jujn</url>
</developer>
</developers>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-dependencies</artifactId>
<type>pom</type>
<version>${vertx5.version}</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<scope>test</scope>
</dependency>

<!-- 消除测试时警告:No SLF4J providers were found -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>2.0.12</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>com/alibaba/fastjson2/**/*.java</include>
</includes>
<systemPropertyVariables>
<user.timezone>Asia/Shanghai</user.timezone>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.alibaba.fastjson2.support.vertx;

import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.reader.ObjectReader;
import io.vertx.core.buffer.Buffer;

import java.lang.reflect.Type;
import java.util.Base64;

public class BufferReader implements ObjectReader<Buffer> {
public static final BufferReader INSTANCE = new BufferReader();

@Override
public Buffer readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
if (jsonReader.nextIfNull()) {
return null;
}

String base64Str = jsonReader.readString();
return base64Str == null ? null : Buffer.buffer(Base64.getUrlDecoder().decode(base64Str));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.alibaba.fastjson2.support.vertx;

import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriter;
import io.vertx.core.buffer.Buffer;

import java.lang.reflect.Type;
import java.util.Base64;

public class BufferWriter implements ObjectWriter<Buffer> {
public static final BufferWriter INSTANCE = new BufferWriter();

@Override
public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
if (object == null) {
jsonWriter.writeNull();
return;
}

Buffer buffer = (Buffer) object;
String base64Str = Base64.getUrlEncoder().withoutPadding().encodeToString(buffer.getBytes()); // 无填充的 Base64
jsonWriter.writeString(base64Str);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.alibaba.fastjson2.support.vertx;

import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.reader.ObjectReader;

import java.lang.reflect.Type;
import java.util.Base64;

public class ByteArrayReader implements ObjectReader<byte[]> {
public static final ByteArrayReader INSTANCE = new ByteArrayReader();

@Override
public byte[] readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
if (jsonReader.nextIfNull()) {
return null;
}

String base64Str = jsonReader.readString();
return base64Str == null ? null : Base64.getUrlDecoder().decode(base64Str);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.alibaba.fastjson2.support.vertx;

import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriter;

import java.lang.reflect.Type;
import java.util.Base64;

public class ByteArrayWriter implements ObjectWriter<byte[]> {
public static final ByteArrayWriter INSTANCE = new ByteArrayWriter();

@Override
public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
if (object == null) {
jsonWriter.writeNull();
return;
}

byte[] bytes = (byte[]) object;
String base64Str = Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); // 无填充的 Base64
jsonWriter.writeString(base64Str);
}
}
Loading
Loading