You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:45:02