簡體   English   中英

如何將 map 異構 JSON 陣列轉換為 Java ZA8CFDE6331BD59EB26AC96F8911ZC4?

[英]How do I map a heterogeneous JSON array to a Java object?

我通過 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"]
]

我認為它是一個 arrays 數組,內部包含異構類型(總是相同的類型以相同的順序)。 作為中間步驟,我已將其保存到文本文件中,但我想將其讀回並將 map 保存到此類對象的數組中:

    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 映射。 這是可行的還是我應該以某種方式手動解析文本?

我將分兩步執行此操作:

  1. 使用 Jackson 將 JSON 內容讀入List<Object>
  2. 將每個List<Object>轉換為MinuteCandle object 並將這些對象收集到MinuteCandle列表中。
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        File file = new File("example.json");
        List<List<Object>> lists = objectMapper.readValue(file, new TypeReference<List<List<Object>>>() {});
        List<MinuteCandle> minuteCandles = new ArrayList<>();
        for (List<Object> list : lists) {
            minuteCandles.add(MinuteCandle.createFromList(list));
        }
    }
}

可以通過在MinuteCandle class 中添加 static 方法來實現從List<Object>MinuteCandle的轉換(上面的第 2 步)。

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 指定為ARRAY的地方用它注釋您的 class :

@JsonFormat(shape = JsonFormat.Shape.ARRAY)
class MinuteCandle

此外,如果您想存儲價格,請考慮使用BigDecimal而不是double

也可以看看:

假設文件中存儲的文本是有效的JSON,類似於How to Read JSON data from txt file in Java? 一個可以使用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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM