Java迭代映射值
我有个问题。我有以下JSON:Java迭代映射值,java,json,dictionary,arraylist,Java,Json,Dictionary,Arraylist,我有个问题。我有以下JSON: { "Market":"USDT", "Coin":"BTC", "Period":"1h", "EmergencyPerc":-25, "TakeProfitPerc":1.2, "ProtectiveOrdersEnabled":"no&
{
"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做了所有的事情。但是谢谢你的帮助!