首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android JSON 解析動態鍵名對象:Gson 映射 Map 處理不定字段

     編輯:程式設計綜合問答

數據特徵

{
  "spec_name": { "29": "口味" },
  "spec_value": { "29": { "403": "原裝進口" } }
}

spec_name、spec_value 內部鍵 ("29", "403") **動態不固定**,對應值結構也不同。

解析策略:Map + 類型安全轉換

1. 定義數據類

public class GoodsInfo {
    public Map spec_name;      // "29" -> "口味"
    public Map> spec_value; // "29" -> {"403":"原裝進口"}
    // 其他字段...
}

2. Gson 直接反序列化

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(); // "原裝進口"
        }
    }
}

3. 若結構更複雜,用 JsonElement 手動遍歷

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 鍵即為動態 ID
值結構異構Map 或 JsonElement 統一接收,運行時類型判斷
嵌套層級不定遞歸遍歷 JsonElement

避坑指南

  • **不要試圖為每個動態鍵建立 Java 類**,Map/JsonElement 才是正解。
  • Gson 默認將 JSON 對象反序列化為 LinkedTreeMap,類型擦除後需 getAsString()/getAsJsonObject() 安全轉換。
  • 若字段可能缺失,用 has("key") 判斷再 get(),避免 NPE。
  • 大數據量時考慮流式解析 JsonReader 降低內存峰值。

核心模式:**動態鍵 → Map/String 鍵值對,嵌套動態 → 遞歸 Map/JsonElement**,Gson/Jackson 原生支持,無需造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved