Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java迭代映射值_Java_Json_Dictionary_Arraylist - Fatal编程技术网

Java迭代映射值

Java迭代映射值,java,json,dictionary,arraylist,Java,Json,Dictionary,Arraylist,我有个问题。我有以下JSON: { "Market":"USDT", "Coin":"BTC", "Period":"1h", "EmergencyPerc":-25, "TakeProfitPerc":1.2, "ProtectiveOrdersEnabled":"no&

我有个问题。我有以下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;

    }
}
公共类代理策略{
私人市场;
私人弦币;
私有字符串周期;
私人双应急电话;
私人双重盈利机构;
私有字符串protectiveOrdersEnabled;
私人双保险公司;
私有字符串的有效期;
私有字符串EMABuySellNameLow;
私有字符串EmabySellNameHigh;
私有字符串:解冻期;
私有字符串EMAUnfreezeNameLow;
私有字符串EMAUnfreezeNameHigh;
私有字符串模板;
private ArrayList priceDropSells=新建ArrayList();
公共代理策略parseJsonToObject(字符串jsonString){
Gson Gson=新的Gson();
fromJson(jsonString,AgentStrategy.class);
Map Map=gson.fromJson(jsonString,Map.class);
this.market=map.get(“市场”).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.emabuysellnamehight=map.get(“emabuysellnamehight”).toString();
this.emaunfreezepiriod=map.get(“emaunfreezepiriod”).toString();
this.EMAUnfreezeNameLow=map.get(“EMAUnfreezeNameLow”).toString();
this.EMAUnfreezeNameHigh=map.get(“EMAUnfreezeNameHigh”).toString();
this.simTemplate=map.get(“simTemplate”).toString();
//降价出售
Map priceDropSellsMap=(Map)Map.get(“PriceDropSells”);
// ???
归还这个;
}
私人类价格下跌{
私有字符串周期;
私有字符串编号;
私人双perc;
}
}

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

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

对象priceDropSellsMap=map.get(“PriceDropSells”)


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

你不需要所有的地图资料。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);
    }
}
类测试
{
私人类价格下跌{
私有字符串周期;
私有字符串编号;
私人双Perc;
}
公共类代理策略{
私人市场;
私人弦币;
私有字符串周期;
私人双应急电话;
私人双重盈利机构;
私有字符串ProtectiveOrdersEnabled;
私人双保险公司;
私有字符串的有效期;
私有字符串EMABuySellNameLow;
私有字符串EmabySellNameHigh;
私有字符串:解冻期;
私有字符串EMAUnfreezeNameLow;
私有字符串EMAUnfreezeNameHigh;
私有字符串模板;
私人ArrayList PriceDropSells;
}
公共静态void main(字符串[]args)引发java.lang.Exception
{
BufferedReader BufferedReader=new BufferedReader(新文件读取器(路径到json文件));
Gson Gson=新的Gson();
AgentStrategy agent=gson.fromJson(bufferedReader,AgentStrategy.class);
System.out.println(agent.PriceDropSells.get(0.Perc));
}
}

谢谢,这是一个数组。使用类
PriceDropSells
?@A.Vreeswijk将其解析为arraylist的最佳方法是什么?这通常是SO.SO上推荐的解决方案,
map.get(“PriceDropSells”)
是一个数组,这个数组里面是什么?数组看起来是这样的:
[{Period=4h,Number=4,Perc=-1.0},{Period=1h,Number=2,Perc=-2.0}]
AgentStrategy需要是一个数组,因为我可以在1个AgentStrategy中有多个@我不知道你的意思。JSON文件是否有一个
AgentStrategy
对象数组,或者您是否有多个JSON源?很抱歉,JSON有一个名为
AgentStrategy
的对象,其中包含多个
PriceDropSell
对象。所以我想把它们存储在
数组列表中。我将答案更新为
ArrayList
而不是数组。非常感谢!这对我有用。我的名字用小写的原因是,因为在我目前的研究中,我知道第一个字母必须是小写的,所以我尝试了,然后重新映射了所有的字母,因为我父亲用CamelCase xD做了所有的事情。但是谢谢你的帮助!