如何将异构JSON数组映射到Java对象?
我通过API下载了大量历史加密市场数据。它的格式如下:如何将异构JSON数组映射到Java对象?,java,json,jackson,Java,Json,Jackson,我通过API下载了大量历史加密市场数据。它的格式如下: [ [1601510400000,"4.15540000","4.16450000","4.15010000","4.15030000","4483.01000000",1601510459999,"18646.50051400",50,"2943.27000000","12241.83706
[
[1601510400000,"4.15540000","4.16450000","4.15010000","4.15030000","4483.01000000",1601510459999,"18646.50051400",50,"2943.27000000","12241.83706500","0"],
...
[1609490340000,"4.94020000","4.95970000","4.93880000","4.94950000","5307.62000000",1609490399999,"26280.03711000",98,"3751.46000000","18574.22402400","0"]
]
我认为这是一个数组数组,内部数组包含异构类型(总是以相同的顺序包含相同的类型)。作为中间步骤,我已将其保存到文本文件中,但我希望将其读回并映射到此类对象的数组中:
public class MinuteCandle {
private long openTime;
private double openValue;
private double highValue;
private double lowValue;
private double closeValue;
private double volume;
private long closeTime;
private double quoteAssetVolume;
private int numberOfTrades;
private double takerBuyBaseAssetVolume;
private double takerBuyQuoteAssetVolume;
private double someGarbageData;
//...
}
我正在使用Spring框架和jackson库进行json映射。这是可行的还是我应该以某种方式手动解析文本?假设文件中存储的文本是有效的JSON,类似于one可以使用的解决方案
com.google.gson.gson
,如下所示:
import com.google.gson.Gson;
import java.io.FileReader;
import java.io.Reader;
public class Main {
public static void main(String[] args) throws Exception {
try (Reader reader = new FileReader("somefile.txt")) {
Gson gson = new Gson();
MinuteCandle[] features = gson.fromJson(reader, MinuteCandle[].class);
}
}
}
我将分两步进行:
list
列表列表
转换为分钟烛光
对象
并将这些对象收集到MinuteCandle
s列表中数组的位置使用并注释类:
@JsonFormat(shape = JsonFormat.Shape.ARRAY)
class MinuteCandle
也可以考虑使用<代码> BigDecimal <代码>,而不是<代码>双< /代码>,如果您想存储一个价格,
另见:
谢谢,但我怀疑事情可能会这么简单。不过,尝试了一下,得到了“java.lang.IllegalStateException:应该是BEGIN_对象,但在第1行第3列路径$[0]处是BEGIN_数组”,这非常有效,谢谢newtypereference()
可以替换为newtypereference()
。我可能最终使用数组而不是arraylist,因为它永远不需要改变大小,而且我将运行昂贵的计算。哇,这也很有效,而且比Thomas的解决方案更简单。我不认为Jackson会知道映射到哪个字段,但很明显,它只是从上到下进行映射。另外,感谢您推荐BigDecimal的价格。我会调查的。
public static MinuteCandle createFromList(List<Object> list) {
MinuteCandle m = new MinuteCandle();
m.openTime = (Long) list.get(0);
m.openValue = Double.parseDouble((String) list.get(1));
m.highValue = Double.parseDouble((String) list.get(2));
m.lowValue = Double.parseDouble((String) list.get(3));
m.closeValue = Double.parseDouble((String) list.get(4));
m.volume = Double.parseDouble((String) list.get(5));
m.closeTime = (Long) list.get(6);
m.quoteAssetVolume = Double.parseDouble((String) list.get(7));
m.numberOfTrades = (Integer) list.get(8);
m.takerBuyBaseAssetVolume = Double.parseDouble((String) list.get(9));
m.takerBuyQuoteAssetVolume = Double.parseDouble((String) list.get(10));
m.someGarbageData = Double.parseDouble((String) list.get(11));
return m;
}
@JsonFormat(shape = JsonFormat.Shape.ARRAY)
class MinuteCandle