Попытка преобразовать JSONArray в JSONObject - PullRequest
0 голосов
/ 27 марта 2019

Я получаю следующую ошибку:

Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: класс org.json.simple.JSONArray не может быть приведен к классу org.json.simple.JSONObject (org.json.simple.JSONArray и org.json.simple.JSONObject находятся в безымянном модуле загрузчика 'app')

Конечная точка, в которой я получаю JSON:

https://www.okex.com/api/spot/v3/instruments

Я искал об ошибке, я думаю, проблема в том, что я получаю JSONArray вместо JSONObject, но мне нужно фильтровать по ключу, так как мне нужно получить каждый "base_currency"из JSON, поэтому мне нужно JSONObject для фильтрации через этот ключ, потому что не могу сделать это с JSONArray, потому что он имеет только фильтр по индексу.Но я не знаю, как это сделать

Ниже приведен исходный код, который дает мне ошибку:

    private String UrlBase = "https://www.okex.com/";
private URL url;
private String inline="";
private JSONObject jobj;
private JSONObject jobj1;
private Scanner sc;
private String Symbols = "api/spot/v3/instruments";
private String Param1= "base_currency";
private JSONArray arr;
private JSONArray arr1;
private JSONParser prs;
private HttpURLConnection conn;
private ArrayList Monedas = new ArrayList();
private Conexion conc = new Conexion();

public void CargarMonedasNuevasOkex() throws IOException {



    try {
        url = new URL(UrlBase+Symbols);
    } catch (MalformedURLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } 

    try {
        conn = (HttpURLConnection)url.openConnection();
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    conn.setRequestMethod("GET");
    conn.connect(); 

    int responsecode = conn.getResponseCode(); 

    if(responsecode != 200) {

        throw new RuntimeException("HttpResponseCode: " +responsecode);

    }
    else{

        sc = new Scanner(url.openStream());

        while(sc.hasNext())
        {
            inline+= sc.nextLine();
        }
        sc.close();

        JSONParser parse = new JSONParser();
        try {

            jobj1 = (JSONObject) parse.parse(inline);

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        arr1 = (JSONArray) jobj1.get(Param1);
        System.out.println(arr.get(0));
        for( int a=0; a<arr1.size(); a++ ) {

            jobj1 = (JSONObject) arr1.get(a);
        }
   }

}

Только что отредактированный с правильным кодом,другой был в порядке.извините

Ответы [ 2 ]

1 голос
/ 27 марта 2019

попробуйте использовать для этого библиотеку gson (пакет com.google.gson).используйте следующий синтаксис

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.create().fromJson(yourJosnArray, yourObject.class)

, если у вас есть какое-либо свойство даты, которое вы должны использовать

gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());

public class DateDeserializer implements JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
        String date = element.getAsString();
        return TimeService.parseDate(date,"yyyy-MM-dd'T'HH:mm:ss");

    }
}
0 голосов
/ 27 марта 2019

Публикация полной программы, чтобы вы не пропустили ни одного импорта. Я выполнил эту программу и получил результат. Также добавлены простые json-зависимости.

        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>


import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Example {
    private String UrlBase = "https://api.binance.com/";
    private URL url;
    private String inline = "";
    private JSONObject jobj;
    private Scanner sc;
    private String Symbols = "api/v1/exchangeInfo";
    private JSONObject jbj1;
    private JSONArray arr;
    private HttpURLConnection conn;

    public void CargarMonedasNuevasBinance() throws IOException {

        String Param1 = "symbols";
        String Param2 = "baseAsset";
        try {
            url = new URL(UrlBase + Symbols);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }

        try {
            conn = (HttpURLConnection) url.openConnection();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        conn.setRequestMethod("GET");
        conn.connect();
        int responsecode = conn.getResponseCode();
        if (responsecode != 200) {
            throw new RuntimeException("HttpResponseCode: " + responsecode);
        } else {
            sc = new Scanner(url.openStream());
            while (sc.hasNext()) {
                inline += sc.nextLine();
            }
            sc.close();
            JSONParser parse = new JSONParser();
            try {

                jobj = (JSONObject) parse.parse(inline);

            System.out.println(jobj.toString());
            org.json.JSONObject jsonObj = new    org.json.JSONObject(jobj.toString());
            System.out.println(jsonObj.toString());

            } catch (ParseException e) {
                e.printStackTrace();
            }
            arr = (JSONArray) jobj.get(Param1);
            for (int a = 0; a < arr.size(); a++) {

                jbj1 = (JSONObject) arr.get(a);
            }
        }
    }
}
...