簡體   English   中英

使用minimal-json解析未命名的嵌套數組?

[英]Parsing unnamed nested arrays with minimal-json?

因此,我正在開發一個相當簡單的Java程序,該程序從加密貨幣交易所獲取市場數據並向用戶顯示信息。 我正在使用minimal-json庫。

這是我當前的代碼:

public class Market {
    static JsonArray arrayBittrex;

    public static void startTimer(){
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                String url = "https://bittrex.com/api/v1.1/public/getmarketsummaries";
                try {
                    URL url2 = new URL(url);
                    URLConnection con = url2.openConnection();
                    InputStream in = con.getInputStream();
                    String encoding = "UTF-8";
                    String body = IOUtils.toString(in, encoding);
                    arrayBittrex = Json.parse(body).asObject().get("result").asArray();
                }
                catch(MalformedURLException e) {}
                catch(IOException e) {}
            }
        }, 0,5000);
    }

    public static float getPrice(String exchange, String market) {
        for (JsonValue item : arrayBittrex) {
            float last = item.asObject().getFloat("Last", 0);
            System.out.println(last);
            return last;
        }
        return 0;
    }
}

例如,此代碼適用於簡單的json(來自https://bittrex.com/api/v1.1/public/getmarketsummary?market=btc-ltc ):

{
    "success" : true,
    "message" : "",
    "result" : [{
            "MarketName" : "BTC-LTC",
            "High" : 0.01350000,
            "Low" : 0.01200000,
            "Volume" : 3833.97619253,
            "Last" : 0.01349998
        }
    ]
}

它將正確返回數組中的“ Last”值。 但是,當json具有多個數組時(例如https://bittrex.com/api/v1.1/public/getmarketsummaries ),這將無法工作:

{
    "success" : true,
    "message" : "",
    "result" : [{
            "MarketName" : "BTC-888",
            "High" : 0.00000919,
            "Low" : 0.00000820,
            "Volume" : 74339.61396015,
            "Last" : 0.00000820
        }, {
            "MarketName" : "BTC-A3C",
            "High" : 0.00000072,
            "Low" : 0.00000001,
            "Volume" : 166340678.42280999,
            "Last" : 0.00000005
        }
    ]
}

所以我的問題是:如何通過按“ MarketName”值搜索數組來獲得“ Last”值?

這是使用Java 8庫Dynamics來解決此問題的直接且為空的方法。 我們將把json解析為Map ,然后根據需要動態讀取該映射。

所以首先我們可以使用Jackson,Gson或其他東西來轉換json-> map。

// com.fasterxml.jackson.core:jackson-databind json -> map
Map jsonMap = new ObjectMapper()
    .enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS)
    .readValue(jsonStringOrInputSourceEtc, Map.class);

現在,我們可以獲得一個Dynamic實例。 並且,例如,獲取BTC-A3C- 最后值。

Dynamic json = Dynamic.from(jsonMap);

BigDecimal a3cLast = json.get("result").children()
    .filter(data -> data.get("MarketName").asString().equals("BTC-A3C"))
    .findAny()
    .flatMap(data -> data.get("Last").maybe().convert().intoDecimal())
    .orElse(BigDecimal.ZERO); 
// 5E-8

或者將整個批次轉換成MarketName- > Last value的地圖

Map<String, BigDecimal> marketNameLastValue = json.get("result").children()
    // assume fields are always present, otherwise see #maybe() methods
    .collect(toMap(
        data -> data.get("MarketName").asString(),
        data -> data.get("Last").convert().intoDecimal()
    )); 
// {BTC-A3C=5E-8, BTC-888=0.00000820}

查看更多示例https://github.com/alexheretic/dynamics

暫無
暫無

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

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