如何通过GSON反序列化带字段类型容器的JSON至SimpleClass?
问题描述
我有一个带字段类型容器的JSON,内容如下:
var inputJson = """ { "stringField1": { "string": "stringField1Value" } } """;
同时定义了如下SimpleClass类:
package model; import lombok.Data; @Data public class SimpleClass { private Long longField; private String stringField1; private String stringField2; }
请问如何通过GSON将该JSON反序列化为SimpleClass实例?Gson或GsonBuilder是否有默认配置可用?我尝试配置GsonBuilder但未成功。
解决方案
Gson没有默认配置能直接处理这种嵌套的类型容器结构,必须自定义反序列化器来解析这种字段值被包裹在类型键下的格式。
步骤1:自定义通用反序列化器
创建一个通用反序列化器,提取嵌套在类型字段里的实际值:
import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import java.lang.reflect.Type; public class WrappedTypeDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { // 遍历JSON对象的键,提取对应类型的字段值 for (String key : json.getAsJsonObject().keySet()) { JsonElement value = json.getAsJsonObject().get(key); return context.deserialize(value, typeOfT); } return null; } }
步骤2:注册反序列化器到GsonBuilder
创建Gson实例时,为需要处理的类型注册自定义反序列化器:
import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class Main { public static void main(String[] args) { String inputJson = """ { "stringField1": { "string": "stringField1Value" } } """; Gson gson = new GsonBuilder() // 为String类型注册反序列化器 .registerTypeAdapter(String.class, new WrappedTypeDeserializer<String>()) // 若Long类型也有类似嵌套结构,同样注册 .registerTypeAdapter(Long.class, new WrappedTypeDeserializer<Long>()) .create(); SimpleClass simpleClass = gson.fromJson(inputJson, SimpleClass.class); System.out.println(simpleClass.getStringField1()); // 输出:stringField1Value System.out.println(simpleClass.getLongField()); // 输出:null(JSON无该字段) System.out.println(simpleClass.getStringField2()); // 输出:null(JSON无该字段) } }
补充说明
- 该反序列化器可通用处理所有基本包装类型,前提是JSON中的类型键(如
"string")与Java类型严格对应。 - Gson默认规则不支持这种嵌套结构,必须通过自定义反序列化器扩展解析逻辑。
内容的提问来源于stack exchange,提问作者ERAS
相关产品推荐
相关产品推荐

