如何使用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
相关产品推荐
相关产品推荐

