You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Google Gson序列化与反序列化Vert.x JsonObject和JsonArray

解决Gson序列化/反序列化Vert.x JsonObject/JsonArray的结构问题

你遇到的问题是因为Gson默认会反射序列化Vert.x JsonObject和JsonArray的内部存储结构(map和list字段),导致序列化后的JSON包含多余层级,反序列化后结构不符合预期。解决方式是为这两个类自定义Gson TypeAdapter,让Gson使用Vert.x自身的JSON处理逻辑。

步骤1:自定义TypeAdapter

创建适配JsonObject和JsonArray的TypeAdapter类:

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import java.io.IOException;

public class JsonObjectTypeAdapter extends TypeAdapter<JsonObject> {
    @Override
    public void write(JsonWriter out, JsonObject value) throws IOException {
        // 利用Vert.x自身的toJson方法生成标准JSON
        out.jsonValue(value.toJson());
    }

    @Override
    public JsonObject read(JsonReader in) throws IOException {
        // 将读取的JSON元素转换为Vert.x JsonObject
        JsonElement element = JsonParser.parseReader(in);
        return new JsonObject(element.getAsJsonObject());
    }
}

public class JsonArrayTypeAdapter extends TypeAdapter<JsonArray> {
    @Override
    public void write(JsonWriter out, JsonArray value) throws IOException {
        out.jsonValue(value.toJson());
    }

    @Override
    public JsonArray read(JsonReader in) throws IOException {
        JsonElement element = JsonParser.parseReader(in);
        return new JsonArray(element.getAsJsonArray());
    }
}

步骤2:注册TypeAdapter到Gson

修改Gson实例的创建逻辑,注册上述适配器:

private static Gson gson = new GsonBuilder()
        .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
        .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
        // 注册自定义适配器
        .registerTypeAdapter(JsonObject.class, new JsonObjectTypeAdapter())
        .registerTypeAdapter(JsonArray.class, new JsonArrayTypeAdapter())
        .create();

测试验证

运行你的测试代码,此时反序列化后的输出会符合预期:

{"test":"dddd","aaa":"dddd","res":{"interface":["aaaa"]}}

原理说明

Vert.x的JsonObject内部通过Map存储键值对,JsonArray通过List存储元素。Gson默认的反射序列化会直接暴露这些内部字段,导致JSON结构冗余。自定义TypeAdapter后,我们复用了Vert.x自身的JSON序列化逻辑,生成标准的JSON格式;反序列化时则将Gson解析的JSON元素转换为Vert.x的对象,保证结构正确。

内容的提问来源于stack exchange,提问作者chaitas shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:02:12