java如何将自定义反序列化器Gson中的JsonElement值小写?
我的类有一个自定义反序列化程序,如下所示:
private class HolderDeserializer implements JsonDeserializer<Holder> {
@Override
public Holder deserialize(JsonElement json, Type type, JsonDeserializationContext context)
throws JsonParseException {
Type mapType = new TypeToken<Map<String, String>>() {}.getType();
// in the below data map, I want value to be stored in lowercase
// how can I do that?
Map<String, String> data = context.deserialize(json, mapType);
return new Holder(data);
}
}
这是我在创建Gson对象时注册反序列化程序的方式:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Holder.class, new HolderDeserializer());
Gson gson = gsonBuilder.create();
最后,像这样解析我的JSON:
Type responseType = new TypeToken<Map<String, Holder>>() {}.getType();
Map<String, Holder> response = gson.fromJson(jsonLine, responseType);
在我的deserialize
方法中,json
的值如下{"linkedTo":"COUNT"}
,然后作为{linkedTo=COUNT}
加载到数据映射中。我想看看是否有任何方法可以使data
map的所有值都是小写的,因此它应该像这样自动存储在数据映射中而不是这个{linkedTo=COUNT}
有没有办法在Gson中自动实现这一点
更新:
以下是我的JSON内容:
{
"abc": {
"linkedTo": "COUNT",
// possibly more data...
},
"plmtq": {
"linkedTo": "TITLE",
"decode": "TRUE",
// possibly more data...
}
}
# 1 楼答案
首先,建议使用GsonTypeAdapter代替JsonDeserializer。所以我要用它来回答你的问题:
More information.
问题:我们如何在反序列化之前修改json内容
解决方案之一:在反序列化之前对json内容进行预处理,并修改其部分内容
我们如何使用TypeAdapter实现这一点:定义一个自定义
TypeAdapter
,在其read
方法(在反序列化之前调用)获取json内容并修改内容代码示例:
定义一个
TypeAdapterFactory
和一个TypeAdapter
我们在反序列化之前添加了一个额外的进程。我们从json内容中获取
entrySet
,并更新linkedTo
键的值工作样本:
输出:
This is the similar answer for your question.