悠悠楠杉
网站页面
正文:
在实际开发中,我们常遇到JSON数据的键名动态变化的情况(如API返回的字段名包含变量或时间戳)。这类数据无法直接用静态POJO映射,而Gson库提供了灵活的解决方案。
假设有一个天气API返回如下数据,其中20231105代表日期且每天变化:json
{
"20231105": {"temp": 22, "humidity": 60},
"20231106": {"temp": 18, "humidity": 70}
}
键名20231105和20231106是动态的,传统POJO无法直接定义对应字段。
使用TypeToken和Map结构处理动态键值:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.Map;
public class WeatherParser {
public static void main(String[] args) {
String json = "{\"20231105\": {\"temp\": 22, \"humidity\": 60}}";
Type type = new TypeToken<Map<String, WeatherData>>() {}.getType();
Map<String, WeatherData> result = new Gson().fromJson(json, type);
result.forEach((date, data) -> {
System.out.println("日期: " + date);
System.out.println("温度: " + data.getTemp());
});
}
}
class WeatherData {
private int temp;
private int humidity;
// Getter和Setter省略
}
若JSON多层嵌套动态键(如城市名+日期),可通过组合Map和自定义类解决:
Type type = new TypeToken<Map<String, Map<String, WeatherData>>>() {}.getType();
Map<String, Map<String, WeatherData>> nestedResult = new Gson().fromJson(json, type);
TypeToken实例;ClassCastException,需添加边界检查;JsonElement手动遍历节点。通过Gson的灵活设计,开发者能高效应对各类动态JSON结构,平衡代码可读性与运行效率。