如何使用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
相关产品推荐
相关产品推荐

