【问题标题】:Java Iterate over Map valuesJava 迭代 Map 值
【发布时间】:2021-05-03 12:57:33
【问题描述】:

我有问题。我有以下 JSON:

{
   "Market":"USDT",
   "Coin":"BTC",
   "Period":"1h",
   "EmergencyPerc":-25,
   "TakeProfitPerc":1.2,
   "ProtectiveOrdersEnabled":"no",
   "EMACrossMarginPerc":0.08,
   "EMABuySellPeriod":"5m",
   "EMABuySellNameLow":"EMA5",
   "EMABuySellNameHigh":"EMA20",
   "EMAUnfreezePeriod":"1h",
   "EMAUnfreezeNameLow":"EMA20",
   "EMAUnfreezeNameHigh":"EMA200",
   "SimTemplate":"t001",
   "PriceDropSells":[
      {
         "Period":"3h",
         "Number":"4",
         "Perc":"-1.0"
      },
      {
         "Period":"1h",
         "Number":"2",
         "Perc":"-2.0"
      }
   ]
}

在我的 java 类中,我添加了以下代码以将 Json 作为对象解析为当前类:

public class AgentStrategy {

    private String market;
    private String coin;
    private String period;
    private double emergencyPerc;
    private double takeProfitPerc;
    private String protectiveOrdersEnabled;
    private double EMACrossMarginPerc;
    private String EMABuySellPeriod;
    private String EMABuySellNameLow;
    private String EMABuySellNameHigh;
    private String EMAUnfreezePeriod;
    private String EMAUnfreezeNameLow;
    private String EMAUnfreezeNameHigh;
    private String simTemplate;
    private ArrayList<AgentStrategyPriceDropSells> priceDropSells = new ArrayList<>();

    public AgentStrategy parseJsonToObject(String jsonString) {
        Gson gson = new Gson();

        gson.fromJson(jsonString, AgentStrategy.class);

        Map map = gson.fromJson(jsonString, Map.class);
        this.market = map.get("Market").toString();
        this.coin = map.get("Coin").toString();
        this.period = map.get("Period").toString();
        this.emergencyPerc = Double.parseDouble(map.get("EmergencyPerc").toString());
        this.takeProfitPerc = Double.parseDouble(map.get("TakeProfitPerc").toString());
        this.protectiveOrdersEnabled = map.get("ProtectiveOrdersEnabled").toString();
        this.EMACrossMarginPerc = Double.parseDouble(map.get("EMACrossMarginPerc").toString());
        this.EMABuySellPeriod = map.get("EMABuySellPeriod").toString();
        this.EMABuySellNameLow = map.get("EMABuySellNameLow").toString();
        this.EMABuySellNameHigh = map.get("EMABuySellNameHigh").toString();
        this.EMAUnfreezePeriod = map.get("EMAUnfreezePeriod").toString();
        this.EMAUnfreezeNameLow = map.get("EMAUnfreezeNameLow").toString();
        this.EMAUnfreezeNameHigh = map.get("EMAUnfreezeNameHigh").toString();
        this.simTemplate = map.get("SimTemplate").toString();


        // PRICE DROP SELLS
        Map priceDropSellsMap = (Map) map.get("PriceDropSells");
        // ???

        return this;
    }

    private class PriceDropSell {

        private String period;
        private String number;
        private double perc;

    }
}

该函数应该返回一个完全填充的对象,但我正在努力处理ArrayList&lt;PriceDropSell&gt;。问题是我不知道如何将我的 JSON 中的PriceDropSells 存储为ArrayList&lt;PriceDropSell&gt;。除了 PriceDropSell,每个字段都存储在 AgentStrategy 类中。如何将该部分解析为 ArrayList?

【问题讨论】:

  • 那么,map.get("PriceDropSells") 是一个数组,这个数组里面是什么?
  • 数组如下所示:[{Period=4h, Number=4, Perc=-1.0}, {Period=1h, Number=2, Perc=-2.0}]

标签: java json dictionary arraylist


【解决方案1】:

您不需要所有地图的东西。 Gson 会直接解析成对象。但请确保名称匹配:

class Test
{
    private class PriceDropSell {
        private String Period;
        private String Number;
        private double Perc;
    }
    public class AgentStrategy {
        private String Market;
        private String Coin;
        private String Period;
        private double EmergencyPerc;
        private double TakeProfitPerc;
        private String ProtectiveOrdersEnabled;
        private double EMACrossMarginPerc;
        private String EMABuySellPeriod;
        private String EMABuySellNameLow;
        private String EMABuySellNameHigh;
        private String EMAUnfreezePeriod;
        private String EMAUnfreezeNameLow;
        private String EMAUnfreezeNameHigh;
        private String SimTemplate;
        private ArrayList<PriceDropSell> PriceDropSells;
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(path_to_json_file));
        Gson gson = new Gson();
        AgentStrategy agent = gson.fromJson(bufferedReader, AgentStrategy.class);
        
        System.out.println(agent.PriceDropSells.get(0).Perc);
    }
}

【讨论】:

  • AgentStrategy 需要是一个数组,因为我可以在 1 中拥有多个 AgentStrategy!
  • @A.Vreeswijk 我不确定你的意思。 JSON 文件是否包含 AgentStrategy 对象数组,或者您是否有多个 JSON 源?
  • 抱歉,JSON 有 1 个名为 AgentStrategy 的对象和多个 PriceDropSell 对象。所以我希望将它们存储在ArrayList&lt;PriceDropSell&gt;
  • 好的。我将答案更新为 ArrayList 而不是数组。
  • 非常感谢!这对我有用。我的名字用小写的原因是,因为在我目前的学习中,我知道第一个字母必须是小写的,所以我尝试了然后重新映射所有内容,因为我父亲在 CamelCase xD 中做了所有事情。不过感谢您的帮助!
【解决方案2】:

为什么不检查“PriceDropSells”的实际对象是什么?只需在不进行任何强制转换的情况下获取该属性并使用调试器检查它的类型:

对象 priceDropSellsMap = map.get("PriceDropSells");

我想它应该是一个数组或一个列表。

【讨论】:

  • 谢谢,这是一个数组。将其解析为具有 PriceDropSells 类的数组列表的最佳方法是什么?
  • @A.Vreeswijk 你熟悉jackson吗?这通常是 SO 上推荐的解决方案。
猜你喜欢
  • 2015-01-07
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2018-05-21
  • 2016-10-08
  • 2019-08-27
相关资源
最近更新 更多