使用Gson将JSON字符串转为Java类时出现null值,求解决方法
问题分析与解决方案
问题根源
Gson转换后控制台打印null,核心原因是**TradeList类的结构与JSON顶级结构不匹配**:
- JSON的顶级结构是一个对象,包含
first这类动态键,每个键对应一个TradeItem列表; TradeList中的dynamicItems字段未与JSON的这种结构建立映射关系,Gson无法自动将JSON数据注入该字段,导致其值为null。
修复步骤
TradeItem和Price类的字段与JSON完全匹配,无需修改。只需调整TradeList类和解析逻辑:
1. 修改TradeList类
添加你期望的交易列表获取方法,并保留必要的构造、getter/setter:
import java.util.Collections; import java.util.List; import java.util.Map; class TradeList { private Map<String, List<TradeItem>> dynamicItems; // Gson需要空构造函数 public TradeList() {} public TradeList(Map<String, List<TradeItem>> dynamicItems) { this.dynamicItems = dynamicItems; } // 实现你想要的列表获取方式 public List<TradeItem> getTradeItems(String tradeListName) { return dynamicItems.getOrDefault(tradeListName, Collections.emptyList()); } public Map<String, List<TradeItem>> getDynamicItems() { return dynamicItems; } public void setDynamicItems(Map<String, List<TradeItem>> dynamicItems) { this.dynamicItems = dynamicItems; } @Override public String toString() { return "TradeList{" + "dynamicItems=" + dynamicItems + '}'; } }
2. 调整解析逻辑
先将JSON解析为Map<String, List<TradeItem>>,再封装到TradeList中:
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.List; import java.util.Map; public class TradeListController { public static List<MerchantRecipe> get_trade_list(String trade_list_name) { String jsonString = "..."; // 替换为你的实际JSON字符串 Gson gson = new GsonBuilder().create(); // 定义Map类型的TypeToken Type tradeMapType = new TypeToken<Map<String, List<TradeItem>>>() {}.getType(); Map<String, List<TradeItem>> tradeMap = gson.fromJson(jsonString, tradeMapType); // 封装到TradeList TradeList tradeList = new TradeList(tradeMap); // 测试获取指定交易列表 List<TradeItem> targetTradeItems = tradeList.getTradeItems(trade_list_name); System.out.println(targetTradeItems); System.out.println(tradeList); return null; // 这里可替换为你需要返回的MerchantRecipe逻辑 } }
效果验证
现在你可以通过tradeList.getTradeItems("first")获取first键对应的所有TradeItem数据,控制台也会打印出正确的对象内容,不再是null。
内容的提问来源于stack exchange,提问作者Milad Majd
相关产品推荐
相关产品推荐

