如何将异构JSON数组映射到Java对象?

如何将异构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

我通过API下载了大量历史加密市场数据。它的格式如下:

[
[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);
        }
    }
}

我将分两步进行:

  • 使用Jackson将JSON内容读入
    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