{
"spec_name": { "29": "口味" },
"spec_value": { "29": { "403": "原裝進口" } }
}
spec_name、spec_value 內部鍵 ("29", "403") **動態不固定**,對應值結構也不同。
public class GoodsInfo {
public Map spec_name; // "29" -> "口味"
public Map> spec_value; // "29" -> {"403":"原裝進口"}
// 其他字段...
}
Gson gson = new Gson();
GoodsInfo info = gson.fromJson(jsonString, GoodsInfo.class);
// 使用
for (Map.Entry entry : info.spec_name.entrySet()) {
String specId = entry.getKey(); // "29"
String specName = entry.getValue(); // "口味"
Map values = info.spec_value.get(specId);
if (values != null) {
for (Map.Entry v : values.entrySet()) {
String valueId = v.getKey(); // "403"
String valueName = v.getValue(); // "原裝進口"
}
}
}
JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject();
JsonObject specNameObj = root.getAsJsonObject("spec_name");
JsonObject specValueObj = root.getAsJsonObject("spec_value");
for (Map.Entry entry : specNameObj.entrySet()) {
String specId = entry.getKey();
String specName = entry.getValue().getAsString();
JsonObject valueObj = specValueObj.getAsJsonObject(specId);
if (valueObj != null) {
for (Map.Entry v : valueObj.entrySet()) {
String valueId = v.getKey();
String valueName = v.getValue().getAsString();
}
}
}
| 挑戰 | 解決 |
|---|---|
| 鍵名動態 (數字 ID) | Map |
| 值結構異構 | Map |
| 嵌套層級不定 | 遞歸遍歷 JsonElement |
LinkedTreeMap,類型擦除後需 getAsString()/getAsJsonObject() 安全轉換。has("key") 判斷再 get(),避免 NPE。JsonReader 降低內存峰值。核心模式:**動態鍵 → Map/String 鍵值對,嵌套動態 → 遞歸 Map/JsonElement**,Gson/Jackson 原生支持,無需造輪子。