如何基于已有Gson实例创建新Gson?需复用原配置并新增配置
从现有Gson实例生成GsonBuilder的解决方案
Gson官方并没有提供直接从已创建的Gson实例反向生成GsonBuilder的API,要复制现有配置并添加新配置,可通过以下两种方式实现:
1. 手动复制已知配置项
如果清楚第三方Gson实例的配置细节,可直接调用Gson的公开getter方法(如果存在),把配置逐个同步到新的GsonBuilder中,再追加自定义配置。
示例代码:
// 获取第三方创建的Gson实例 Gson existingGson = getThirdPartyGsonInstance(); // 初始化Builder并复制现有配置 GsonBuilder builder = new GsonBuilder() .setDateFormat(existingGson.getDateFormat()) .serializeNulls(existingGson.serializeNulls()) .setFieldNamingPolicy(existingGson.getFieldNamingPolicy()) .setPrettyPrinting(existingGson.isPrettyPrinting()); // 添加你的自定义配置 builder.registerTypeAdapter(CustomModel.class, new CustomModelAdapter()); // 创建修改后的Gson实例并设置回第三方入口 Gson modifiedGson = builder.create(); setThirdPartyGsonInstance(modifiedGson);
注意:这种方式的局限性在于,Gson部分内部配置(如自定义TypeAdapterFactory、TypeAdapter)没有对应的公开getter方法,无法通过这种方式复制。
2. 反射读取内部配置(通用方案)
通过反射读取Gson实例的私有字段,获取所有内部配置,再同步到新的GsonBuilder中。这种方式无需提前知晓第三方的配置细节,但依赖Gson的内部实现,不同版本可能存在兼容性问题。
示例代码:
Gson existingGson = getThirdPartyGsonInstance(); GsonBuilder builder = new GsonBuilder(); // 复制字段命名策略 try { Field fieldNamingStrategyField = Gson.class.getDeclaredField("fieldNamingStrategy"); fieldNamingStrategyField.setAccessible(true); FieldNamingStrategy strategy = (FieldNamingStrategy) fieldNamingStrategyField.get(existingGson); builder.setFieldNamingStrategy(strategy); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } // 复制日期格式 try { Field dateFormatField = Gson.class.getDeclaredField("dateFormat"); dateFormatField.setAccessible(true); String dateFormat = (String) dateFormatField.get(existingGson); if (dateFormat != null) { builder.setDateFormat(dateFormat); } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } // 复制所有TypeAdapterFactory try { Field factoriesField = Gson.class.getDeclaredField("factories"); factoriesField.setAccessible(true); List<TypeAdapterFactory> factories = (List<TypeAdapterFactory>) factoriesField.get(existingGson); for (TypeAdapterFactory factory : factories) { builder.registerTypeAdapterFactory(factory); } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } // 添加自定义配置 builder.registerTypeAdapter(AnotherModel.class, new AnotherModelAdapter()); // 生成修改后的Gson实例并替换 Gson modifiedGson = builder.create(); setThirdPartyGsonInstance(modifiedGson);
关于GsonFire的说明
GsonFire同样没有提供反向生成Builder的功能,可参考上述两种方式:若知晓GsonFire的配置项则手动复制,否则通过反射读取其生成的Gson实例内部配置,再基于GsonFireBuilder追加自定义配置。
内容的提问来源于stack exchange,提问作者igr
相关产品推荐
相关产品推荐

