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

如何使用GSON将动态JSON字段名解析为Java对象

解决GSON解析动态前缀字段的问题

针对你这种仅存在一个field_exN格式动态字段的场景,完全可以通过自定义GSON反序列化器实现需求,无需定义大量冗余属性。具体步骤如下:

1. 定义目标Java类

创建包含固定字段和动态字段存储属性的类,用来存放解析后的数据:

public class MyData {
    private String field_basic;
    private String field_basic_country;
    // 存储field_exN对应的数值内容
    private String fieldExValue;
    // 存储field_exN中的N值
    private int fieldExNumber;

    // 生成对应的getter、setter方法
    public String getField_basic() { return field_basic; }
    public void setField_basic(String field_basic) { this.field_basic = field_basic; }
    public String getField_basic_country() { return field_basic_country; }
    public void setField_basic_country(String field_basic_country) { this.field_basic_country = field_basic_country; }
    public String getFieldExValue() { return fieldExValue; }
    public void setFieldExValue(String fieldExValue) { this.fieldExValue = fieldExValue; }
    public int getFieldExNumber() { return fieldExNumber; }
    public void setFieldExNumber(int fieldExNumber) { this.fieldExNumber = fieldExNumber; }
}

2. 实现自定义JsonDeserializer

编写自定义反序列化器,遍历JSON所有字段,定位field_ex开头的字段并提取关键信息:

import com.google.gson.*;
import java.lang.reflect.Type;

public class MyDataDeserializer implements JsonDeserializer<MyData> {
    @Override
    public MyData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        MyData myData = new MyData();

        // 解析固定字段
        myData.setField_basic(jsonObject.get("field_basic").getAsString());
        myData.setField_basic_country(jsonObject.get("field_basic_country").getAsString());

        // 遍历字段,找到field_ex开头的目标字段
        for (String key : jsonObject.keySet()) {
            if (key.startsWith("field_ex")) {
                // 提取N的数值,例如从"field_ex4"中截取得到4
                String numberStr = key.substring("field_ex".length());
                int number = Integer.parseInt(numberStr);
                myData.setFieldExNumber(number);
                // 获取该字段对应的内容
                myData.setFieldExValue(jsonObject.get(key).getAsString());
                // 已知仅存在一个目标字段,找到后直接终止遍历
                break;
            }
        }

        return myData;
    }
}

3. 注册反序列化器并执行解析

在创建Gson实例时注册自定义反序列化器,即可完成JSON解析:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    public static void main(String[] args) {
        String json = "{\n" +
                "\"field_basic\": \"12.3\",\n" +
                "\"field_basic_country\": \"12.3\",\n" +
                "\"field_ex4\": \"2.7\"\n" +
                "}";

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(MyData.class, new MyDataDeserializer())
                .create();

        MyData data = gson.fromJson(json, MyData.class);
        System.out.println("field_exN的N值:" + data.getFieldExNumber());
        System.out.println("field_exN对应的值:" + data.getFieldExValue());
    }
}

无论JSON中是field_ex1还是field_ex100,该方案都能自动提取对应的N值和字段内容,避免冗余属性定义。

内容的提问来源于stack exchange,提问作者user4341206

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:50:56