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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:25:03